确定类的扩展接口

我需要确定表示接口的Class对象是否扩展了另一个接口,即:

package abcd; public Interface IMyInterface extends abdcISomeOtherInterface{ } 

根据规范, Class.getSuperClass()将为接口返回null。

如果此Class表示Object类,接口,基本类型或void,则返回null。

因此以下不起作用。

 Class interface = Class.ForName("abcdIMyInterface") Class extendedInterface = interface.getSuperClass(); if(extendedInterface.getName().equals("abdcISomeOtherInterface")){ //do whatever here } 

有任何想法吗?

使用Class.getInterfaces,例如:

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

以下代码也可能有所帮助,它将为您提供一个包含特定类的所有超类和接口的集合:

 public static Set> getInheritance(Class in) { LinkedHashSet> result = new LinkedHashSet>(); result.add(in); getInheritance(in, result); return result; } /** * Get inheritance of type. * * @param in * @param result */ private static void getInheritance(Class in, Set> 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> 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(); } 

编辑:添加了一些代码来获取某个类的所有超类和接口。

 if (interface.isAssignableFrom(extendedInterface)) 

是你想要的

我总是首先得到倒序,但最近意识到它与使用instanceof完全相反

 if (extendedInterfaceA instanceof interfaceB) 

是同样的事情,但你必须有类的实例而不是类本身

Class.isAssignableFrom()能做你需要的吗?

 Class baseInterface = Class.forName("abcdIMyInterface"); Class extendedInterface = Class.forName("abdcISomeOtherInterface"); if ( baseInterface.isAssignableFrom(extendedInterface) ) { // do stuff } 

看一下Class.getInterfaces();

 List list = new ArrayList(); for (Class c : list.getClass().getInterfaces()) { System.out.println(c.getName()); } 
 Liast getAllInterfaces(Class clazz){ List interfaces = new ArrayList<>(); Collections.addAll(interfaces,clazz.getInterfaces()); if(!clazz.getSuperclass().equals(Object.class)){ interfaces.addAll(getAllInterfaces(clazz.getSuperclass())); } return interfaces ; }