12

我正在尝试使用反射来确定传入的类是否实现了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

4 回答 4

14

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

return IsWidget.class.isAssignableFrom(clzz);

引用上面链接的 Javadoc:

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。

于 2013-05-03T17:07:04.973 回答
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
于 2013-05-03T17:06:05.010 回答
1

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方法。

于 2013-05-03T17:08:42.380 回答
0

如果这行得通,那应该没问题。您也可以尝试调用该类的cast方法Class并尝试并捕获。

于 2013-05-03T17:07:42.460 回答