我正在尝试使用反射来确定传入的类是否实现了 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
你可以使用 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
方法。
我会用的 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
上课并尝试抓住。