2012-03-27 9 views
7

Ho cercato di farlo da parecchio tempo e non riesco a ottenere l'output desiderato.Ottenere SuperInterfaces in java

Quello che voglio fare è di avere un nome di classe dicono java.util.Vector

ottenere il:

  • le interfacce implementate direttamente se java.util.Vector.
  • le interfacce implementate direttamente dalle superclassi.
  • e, transitivamente, tutte le superinterfacce di queste interfacce.

Qualsiasi aiuto sarebbe apprezzato.

+0

Stai cercando i metodi java.lang.Class? getInterfaces? – Glenn

+0

Sì, uso getInterfaces(); uso la ricorsione per questo o c'è un altro modo? – programmingnewb

+0

Vorrei ricorrere alla ricorsione. Ci sono un certo numero di campioni in giro, ex http://www.java2s.com/Tutorial/Java/0125__Reflection/GetSuperInterfaces.htm – Glenn

risposta

0

Sebbene java.util.Vector non sia un'interfaccia, e quindi non è possibile estenderlo con un'interfaccia, è possibile utilizzare una libreria come Reflections per ospitare questo tipo di funzionalità. Reflections consente di eseguire la scansione del classpath e di eseguire una query per un insieme di condizioni come ciò che implementa o estende la classe/interfaccia specificata. L'ho usato con successo su un paio di progetti in cui avevo bisogno di eseguire la scansione per implementazioni di interfaccia e classi annotate.

ecco il link esplicito: http://code.google.com/p/reflections/

Inoltre, se si sta cercando di sapere solo quali sono di classe/interfaccia di una classe estende/implementa si può semplicemente utilizzare l'API di classe riflessione tramite l'attributo class.

Ecco alcuni esempi:

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

si potrebbe fare una BFS utilizzando il reflection per esso.

Inizia con un Set<Class<?>> che contiene solo Vector, e in modo iterativo aumentare il set con nuovi elementi utilizzando Class.getInterfaces() e Class.getSuperclass()

Aggiungere gli elementi appena aggiunto alla Queue [che è necessario per la corsa BFS]. Termina quando la coda è vuota.

elaborazione del messaggio: iterare il Set - e prendere solo oggetti che sono interfacce utilizzando Class.isInterface()

dovrebbe essere simile a quello:

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); 
} 
Problemi correlati