我正在尝试使用反射来确定传入的类是否实现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方法为您提供一个代表interfaces
的Class
数组。或者您也可以使用isAssignableFrom方法,如下所示:
IsWidget.class.isAssignableFrom(clzz);
如果您有Object
,则可以使用instanceof
方法。
如果这有效,应该没问题。您也可以尝试调用Class
类的cast
方法,并执行try-and-catch。