2012-03-27 10 views
7

He estado tratando de hacer esto por bastante tiempo y parece que no puede obtener el resultado deseado.Obtener SuperInterfaces en java

Lo que quiero hacer es tener un nombre de clase dicen java.util.Vector

obtener el:

  • las interfaces implementadas directamente si java.util.Vector.
  • interfaces directamente implementadas por las superclases.
  • y, transitivamente, todas las superinterfaces de estas interfaces.

Cualquier ayuda sería apreciada.

+0

¿Está buscando métodos java.lang.Class? getInterfaces? – Glenn

+0

Sí, yo uso getInterfaces(); ¿uso recursión para esto o hay otra manera? – programmingnewb

+0

Usaría la recursión. Hay una serie de ejemplos, ex http://www.java2s.com/Tutorial/Java/0125__Reflection/GetSuperInterfaces.htm – Glenn

Respuesta

0

Aunque java.util.Vector no es una interfaz, y por lo tanto no puede extenderlo con una interfaz, lo que puede hacer es usar una biblioteca como Reflections para acomodar este tipo de características. Reflections le permite escanear el classpath y consultar un conjunto de condiciones como qué implementa o extiende la clase/interfaz dada. Lo he usado con éxito en un par de proyectos en los que necesitaba escanear implementaciones de interfaz y clases anotadas.

Aquí está el enlace explícito: http://code.google.com/p/reflections/

Además, si usted está buscando sólo para saber de qué clase/interfaz se extiende/implementa sólo puede utilizar la API de la clase de reflexión a través del atributo de clase de una clase.

He aquí algunos ejemplos:

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

se podría hacer mediante el BFSreflection por ello.

de inicio con un Set<Class<?>> que contiene sólo Vector, y de forma iterativa a aumentar el conjunto de nuevos elementos utilizando Class.getInterfaces() y Class.getSuperclass()

Añadir los elementos se agregó a la Queue [que es necesaria para el funcionamiento BFS]. Termine cuando la cola esté vacía.

procesamiento de la publicación: iterar el Set - y tomar sólo los objetos que son las interfaces que utilizan Class.isInterface()

debería ser algo como lo siguiente:

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