如何确定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方法为您提供了一个表示interfaces
的Class
数组。 或者您也可以使用isAssignableFrom方法,如下所示:
IsWidget.class.isAssignableFrom(clzz);
如果您有一个Object
,则可以使用instanceof
方法。
如果有效,那应该没问题。 您也可以尝试调用Class
类的cast
方法并尝试捕获。