Vraag Bepaling van de uitgebreide interfaces van een klasse


Ik moet bepalen of een Class-object dat een interface vertegenwoordigt, een andere interface uitbreidt, dat wil zeggen:

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

volgens de spec Class.getSuperClass () retourneert nul voor een interface.

Als deze Klasse ofwel de   Objectklasse, een interface, a   primitief type, of ongeldig, dan is nul   teruggekeerd.

Daarom zal het volgende niet werken.

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
}

ideeën?


11
2017-09-22 18:23


oorsprong


antwoorden:


Gebruik Class.getInterfaces zoals:

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

Ook de volgende code kan van nut zijn, het geeft je een set met alle superklassen en interfaces van een bepaalde klasse:

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

Bewerken: code toegevoegd om alle superklassen en interfaces van een bepaalde klasse te krijgen.


16
2017-09-22 18:27



if (interface.isAssignableFrom(extendedInterface))

is wat je wilt

ik krijg de volgorde altijd eerst terug, maar heb me onlangs gerealiseerd dat het precies het tegenovergestelde is van het gebruik van instanceof

if (extendedInterfaceA instanceof interfaceB) 

is hetzelfde, maar je moet instanties van de klassen hebben in plaats van de klassen zelf


9
2017-09-22 18:30



Doet Class.isAignableFrom () wat u nodig hebt?

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

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

2
2017-09-22 18:29



Bekijk Class.getInterfaces ();

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

0
2017-09-22 18:28



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

0
2017-09-28 13:57