2008-09-22 5 views
10

Ich muss bestimmen, ob ein Klassenobjekt repräsentiert eine Schnittstelle eine weitere Schnittstelle erstreckt, und zwar:Bestimmung der erweiterten Schnittstellen eines Klasse

package a.b.c.d; 
    public Interface IMyInterface extends a.b.d.c.ISomeOtherInterface{ 
    } 

nach the spec Class.getSuperClass() wird für eine Schnittstelle null zurück.

Wenn diese Klasse repräsentiert entweder die Object-Klasse, eine Schnittstelle, einen Urtyp oder Leere, dann null ist zurückgegeben.

Daher wird das Folgende nicht funktionieren.

Class interface = Class.ForName("a.b.c.d.IMyInterface") 
Class extendedInterface = interface.getSuperClass(); 
if(extendedInterface.getName().equals("a.b.d.c.ISomeOtherInterface")){ 
    //do whatever here 
} 

irgendwelche ideen?

Antwort

15

Verwendung Class.getInterfaces wie:

Class<?> c; // Your class 
for(Class<?> i : c.getInterfaces()) { 
    // test if i is your interface 
} 

Auch der folgende Code hilfreich sein könnte, wird es Ihnen ein Set mit allen Super-Klassen und Schnittstellen einer bestimmten Klasse geben:

public static Set<Class<?>> getInheritance(Class<?> in) 
{ 
    LinkedHashSet<Class<?>> result = new LinkedHashSet<Class<?>>(); 

    result.add(in); 
    getInheritance(in, result); 

    return result; 
} 

/** 
* Get inheritance of type. 
* 
* @param in 
* @param result 
*/ 
private static void getInheritance(Class<?> in, Set<Class<?>> result) 
{ 
    Class<?> superclass = getSuperclass(in); 

    if(superclass != null) 
    { 
     result.add(superclass); 
     getInheritance(superclass, result); 
    } 

    getInterfaceInheritance(in, result); 
} 

/** 
* Get interfaces that the type inherits from. 
* 
* @param in 
* @param result 
*/ 
private static void getInterfaceInheritance(Class<?> in, Set<Class<?>> result) 
{ 
    for(Class<?> c : in.getInterfaces()) 
    { 
     result.add(c); 

     getInterfaceInheritance(c, result); 
    } 
} 

/** 
* Get superclass of class. 
* 
* @param in 
* @return 
*/ 
private static Class<?> getSuperclass(Class<?> in) 
{ 
    if(in == null) 
    { 
     return null; 
    } 

    if(in.isArray() && in != Object[].class) 
    { 
     Class<?> type = in.getComponentType(); 

     while(type.isArray()) 
     { 
      type = type.getComponentType(); 
     } 

     return type; 
    } 

    return in.getSuperclass(); 
} 

Bearbeiten: Code hinzugefügt, um alle Super-Klassen und Schnittstellen einer bestimmten Klasse zu erhalten.

+1

Sieht für mich so aus, als ob es komplizierter wird, als es ist; Neu implementieren, was Java bereits bietet. Angenommen, der gesamte Code ist korrekt, gibt es nur die gleiche Antwort wie der Einzeiler isAssignableFrom aus anderen Antworten. –

0

Werfen Sie einen Blick auf Class.getInterfaces();

List<Object> list = new ArrayList<Object>(); 
for (Class c : list.getClass().getInterfaces()) { 
    System.out.println(c.getName()); 
} 
2

Funktioniert Class.isAssignableFrom(), was Sie brauchen?

Class baseInterface = Class.forName("a.b.c.d.IMyInterface"); 
Class extendedInterface = Class.forName("a.b.d.c.ISomeOtherInterface"); 

if (baseInterface.isAssignableFrom(extendedInterface)) 
{ 
    // do stuff 
} 
9
if (interface.isAssignableFrom(extendedInterface)) 

ist, was Sie wollen

ich immer die Reihenfolge rückwärts auf den ersten bekommen aber klar vor kurzem, dass es genau das Gegenteil ist instanceof der Verwendung

if (extendedInterfaceA instanceof interfaceB) 

die gleiche Sache, aber Sie müssen Instanzen der Klassen und nicht die Klassen selbst haben

0
Liast<Class> getAllInterfaces(Class<?> clazz){ 
    List<Class> interfaces = new ArrayList<>(); 
    Collections.addAll(interfaces,clazz.getInterfaces()); 
    if(!clazz.getSuperclass().equals(Object.class)){ 
     interfaces.addAll(getAllInterfaces(clazz.getSuperclass())); 
    } 
    return interfaces ; 
} 
+1

Sie sollten etwas Kontext hinzufügen, der Ihre Antwort erklärt, anstatt nur Code zur Verfügung zu stellen. – Jaquez