2008-09-22 5 views
10

мне нужно, чтобы определить, является ли объект класса, представляющее собой интерфейс расширяет другой интерфейс, то есть:Определение расширенных интерфейсов класса

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

the spec согласно Class.getSuperClass() возвращает нуль для интерфейса.

Если этот класс представляет собой либо класс объекта, интерфейс, примитивного типа, или пустоту, то нуля является возвращается.

Поэтому следующее не будет работать.

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 
} 

любые идеи?

ответ

15

Используйте Class.getInterfaces, такие как:

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

Также следующий код может быть полезным, это даст вам набор со всеми супер-классов и интерфейсов определенного класса:

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

Редактировать: Добавлен код для получения всех суперклассов и интерфейсов определенного класса.

+1

Мне кажется, что это усложняет ситуацию; переопределяя то, что уже предоставляет Java. Предполагая, что весь код здесь правильный, он просто даст тот же ответ, что и однострочный. AssignableFrom из других ответов. – 2009-02-22 08:58:15

0

Посмотрите на Class.getInterfaces();

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

Does Class.isAssignableFrom() делать то, что вам нужно?

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

является то, что вы хотите

я всегда получаю упорядоченность назад в первый, но недавно понял, что это полная противоположность использования InstanceOf

if (extendedInterfaceA instanceof interfaceB) 

это то же самое, но вы должны иметь экземпляры классов, а не сами классы

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

Вы должны добавить некоторый контекст, объясняющий ваш ответ, а не просто код. – Jaquez 2017-09-28 13:59:08

Смежные вопросы