我试图使用反射来确定传入的类是否实现了一个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;
}
这是决定这个的最好/最effecient方法是什么? 我还看到一个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
您可以使用getInterfaces()
如果你有一个方法Class
对象。
Class c[] = clzz.getInterfaces();
if(Arrays.asList(c).contains(IsWidget.class))
{
return true;
}
该getInterfaces方法给你的阵列Class
代表interfaces
。 或者你也可以使用isAssignableFrom方法如下:
IsWidget.class.isAssignableFrom(clzz);
如果你有一个Object
,你可以使用instanceof
方法。
如果这样的作品,它应该是罚款。 您也可以尝试调用cast
的方法Class
类,做一个尝试,渔获物。