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

时间:2013-05-03 17:03:26

标签: java class 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<?>)方法......

4 个答案:

答案 0 :(得分:13)

我会使用isAssignableFrom方法来确定IsWidget是否是超接口:

return IsWidget.class.isAssignableFrom(clzz);

引用上面链接的Javadoc:

  

确定此Class对象所表示的类或接口   与...相同或者是超类或超级接口   由指定的Class参数表示的类或接口。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您拥有getInterfaces()对象,则可以使用Class方法。

    Class c[] = clzz.getInterfaces();   
    if(Arrays.asList(c).contains(IsWidget.class))
    {
        return true;
    }

getInterfaces方法为您提供了一个代表Class的{​​{1}}数组。或者您也可以使用isAssignableFrom方法,如下所示:

interfaces

如果您有IsWidget.class.isAssignableFrom(clzz); ,则可以使用Object方法。

答案 3 :(得分:0)

如果有效,应该没问题。您也可以尝试调用cast类的Class方法并尝试捕获。