2012-03-27 45 views
7

我一直在試圖做相當長一段時間,似乎無法獲得所需的輸出。在java中獲取超級接口

我想要做的是有一個類名說java.util.Vector

得到:

  • 直接實現的接口,如果java.util.Vector
  • 直接由超類實現的接口。
  • 以及這些接口的所有超級接口。

任何幫助,將不勝感激。

+0

你在尋找java.lang.Class方法嗎? getInterfaces? – Glenn 2012-03-27 00:22:56

+0

是的,我使用getInterfaces();我爲此使用遞歸還是有另一種方式? – programmingnewb 2012-03-27 00:26:13

+0

我會使用遞歸。周圍有許多樣本,例如http://www.java2s.com/Tutorial/Java/0125__Reflection/GetSuperInterfaces.htm – Glenn 2012-03-27 00:40:48

回答

0

儘管java.util.Vector不是一個接口,因此您不能使用接口進行擴展,但您可以使用庫如Reflections來適應這些功能。 Reflections允許您掃描類路徑並查詢一組條件,比如實現或擴展給定的類/接口的條件。我已經成功地在一些需要掃描接口實現和註釋類的項目中使用它。

這裏的明確聯繫:http://code.google.com/p/reflections/

此外,如果你正在尋找只是找出一個類繼承/實現你可以通過類屬性使用類反射API什麼類/接口。

下面是一些例子:

//get all public methods of Vector 
Vector.class.getMethods(); 
//get all methods of the superclass (AbstractList) of Vector 
Vector.class.getSuperclass().getMethods(); 
//get all interfaces implemented by Vector 
Vector.class.getInterfaces(); 
3

你可以使用reflection爲它做一個BFS

開始只包含Vector,並使用Class.getInterfaces()Class.getSuperclass()

添加剛添加的元素到Queue [這是需要的BFS運行]迭代增加一套新的元素Set<Class<?>>。當隊列爲空時終止。

後處理:迭代Set - 並採取只使用Class.isInterface()

應該是這個樣子的是接口的對象:

Class<?> cl = Vector.class; 
Queue<Class<?>> queue = new LinkedList<Class<?>>(); 
Set<Class<?>> types =new HashSet<Class<?>>(); 
queue.add(cl); 
types.add(cl); 
    //BFS: 
while (queue.isEmpty() == false) { 
    Class<?> curr = queue.poll(); 
    Class<?>[] supers = curr.getInterfaces(); 
    for (Class<?> next : supers) { 
     if (next != null && types.contains(next) == false) { 
      types.add(next); 
      queue.add(next); 
     } 
    } 
    Class<?> next = curr.getSuperclass(); 
    if (next != null && types.contains(next) == false) { 
     queue.add(next); 
     types.add(next); 
    } 
} 
    //post processing: 
for (Class<?> curr : types) { 
    if (curr.isInterface()) System.out.println(curr); 
}