如何确定一个Java类实现一个特定的接口(How to determine if a Java Cl

2019-09-01 22:11发布

我试图使用反射来确定传入的类是否实现了一个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<?>)方法...

Answer 1:

我会用isAssignableFrom方法来确定IsWidget是一个超接口:

return IsWidget.class.isAssignableFrom(clzz);

从上面的链接的Javadoc引用:

判定此Class对象所表示的类或接口或者是相同,或是一个超类或超接口中,通过指定的Class参数所表示的类或接口。



Answer 2:

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


Answer 3:

您可以使用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方法。



Answer 4:

如果这样的作品,它应该是罚款。 您也可以尝试调用cast的方法Class类,做一个尝试,渔获物。



文章来源: How to determine if a Java Class implements a particular Interface