我正在尝试使用反射来确定传入的类是否实现了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<?>)
方法......
答案 0 :(得分:13)
我会使用isAssignableFrom
方法来确定IsWidget
是否是超接口:
return IsWidget.class.isAssignableFrom(clzz);
引用上面链接的Javadoc:
确定此Class对象所表示的类或接口 与...相同或者是超类或超级接口 由指定的Class参数表示的类或接口。
答案 1 :(得分:1)
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
答案 2 :(得分:1)
如果您拥有getInterfaces()
对象,则可以使用Class
方法。
Class c[] = clzz.getInterfaces();
if(Arrays.asList(c).contains(IsWidget.class))
{
return true;
}
getInterfaces方法为您提供了一个代表Class
的{{1}}数组。或者您也可以使用isAssignableFrom方法,如下所示:
interfaces
如果您有IsWidget.class.isAssignableFrom(clzz);
,则可以使用Object
方法。
答案 3 :(得分:0)
如果有效,应该没问题。您也可以尝试调用cast
类的Class
方法并尝试捕获。