如何确定Java类是否实现了特定的接口



我正在尝试使用反射来确定传入的类是否实现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方法为您提供一个代表interfacesClass数组。或者您也可以使用isAssignableFrom方法,如下所示:

IsWidget.class.isAssignableFrom(clzz);

如果您有Object,则可以使用instanceof方法。

如果这有效,应该没问题。您也可以尝试调用Class类的cast方法,并执行try-and-catch。

相关内容

  • 没有找到相关文章

最新更新