如何确定Java类是否实现特定接口

我正在尝试使用reflection来确定传入的类是否实现了IsWdidget接口:

 public boolean isAWidget(Class clzz) { Class runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName()); Class[] impls = runtimeClass.getInterfaces(); for(Class clz : impls) if(clz.getName().equals(IsWidget.class.getName())) return true; return false; } 

这是确定这个的最好/最有效的方法吗? 我还看到一个IsWidget.class.isAssignableFrom(Class)方法……

我将使用isAssignableFrom方法来确定IsWidget是否是超接口:

 return IsWidget.class.isAssignableFrom(clzz); 

引用上面链接的Javadoc:

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。

1)这没有任何意义

  Class runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName()); 

试试任何课程

  Class runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName()); System.out.println(runtimeClass == clzz); 

你会得到

 true 

因此,如果您删除此行并直接使用clzz,它已经更有效率了

2)试试这个

 class X extends Thread { } public static void main(String[] args) throws ClassNotFoundException { System.out.print(Arrays.toString(X.class.getInterfaces())); } 

你会得到

 [] 

这类似于你的func正在做的事情,但事实上X实现了Runnable

3)这是一个非常有效的单行解决方案,用于检查类是否实现了接口

  System.out.print(Runnable.class.isAssignableFrom(X.class)); 

产量

 true 

如果您有一个Class对象,可以使用getInterfaces()方法。

  Class c[] = clzz.getInterfaces(); if(Arrays.asList(c).contains(IsWidget.class)) { return true; } 

getInterfaces方法为您提供了一个表示interfacesClass数组。 或者您也可以使用isAssignableFrom方法,如下所示:

 IsWidget.class.isAssignableFrom(clzz); 

如果您有一个Object ,则可以使用instanceof方法。

如果有效,那应该没问题。 您也可以尝试调用Class类的cast方法并尝试捕获。