2012-03-27 10 views
7

Próbowałem zrobić to już od jakiegoś czasu i nie mogę uzyskać żądanego wyniku.Uzyskiwanie SuperInterfaces w java

Co chcę zrobić, to mieć nazwę klasy powiedzieć java.util.Vector

uzyskać:

  • się bezpośrednio wdrożone interfejsy jeśli java.util.Vector.
  • interfejsy bezpośrednio implementowane przez nadklasy.
  • oraz, przechodnie, wszystkie interfejsy superinterfejsów tych interfejsów.

Każda pomoc zostanie doceniona.

+0

Szukasz metod java.lang.Class? getInterfaces? – Glenn

+0

Tak używam getInterfaces(); używać rekursji dla tego lub jest inny sposób? – programmingnewb

+0

Użyłbym rekursji. Istnieje wiele próbek, np. Http://www.java2s.com/Tutorial/Java/0125__Reflection/GetSuperInterfaces.htm – Glenn

Odpowiedz

0

Chociaż java.util.Vector nie jest interfejsem, a zatem nie można go rozszerzyć za pomocą interfejsu, można użyć biblioteki takiej jak Reflections, aby dostosować się do tego rodzaju funkcji. Reflections umożliwia skanowanie ścieżki klas i kwerendy dla zestawu warunków, takich jak implementuje lub rozszerza daną klasę/interfejs. Użyłem go z powodzeniem w kilku projektach, w których musiałem skanować implementacje interfejsu i przypisywane klasy.

Oto wyraźne powiązanie: http://code.google.com/p/reflections/

Dodatkowo, jeśli szukasz po prostu dowiedzieć się, co klasa/interfejs klasa rozszerza/implementuje można po prostu użyć API klasa odbicia za pomocą atrybutu klasy.

Oto kilka przykładów:

//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

Można zrobić BFS pomocą reflection dla niego.

start z Set<Class<?>> który zawiera tylko Vector i iteracyjnie zwiększenia zestaw z nowych elementów za pomocą Class.getInterfaces() i Class.getSuperclass()

Dodać tylko dodatkowe elementy do Queue [który jest niezbędny do uruchomienia BFS]. Zakończ, gdy kolejka jest pusta.

przetwarzanie postu: iteracyjne Set - i podjąć tylko obiekty, które są interfejsy wykorzystujące Class.isInterface()

powinien wyglądać mniej więcej tak:

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); 
} 
Powiązane problemy