确定类是否在Java中实现接口

use*_*041 79 java reflection

我有一个Class对象.我想确定Class对象表示的类型是否实现了特定的接口.我想知道如何实现这一目标?

我有以下代码.基本上它的作用是获取指定包中所有类的数组.然后我想通过数组并将实现接口的Class对象添加到我的地图中.问题是isInstance()将对象作为参数.我无法实例化一个接口.所以我对此感到很茫然.有任何想法吗?

Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
    if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
    {
        retVal.put(clazz.getSimpleName(), clazz);
    }
}
Run Code Online (Sandbox Code Playgroud)

Fla*_*vio 199

你应该使用isAssignableFrom:

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 你有课堂加载问题.如果使用不同的类加载器加载相同的类两次,则两个"Class"实例将不兼容.您可能会看到像`java.lang.ClassCastException:com.my.CustomClass这样的错误无法转换为com.my.CustomClass`或类似的莫名其妙的东西. (3认同)

Ank*_*kur 16

您可以使用以下函数来获取所有已实现的接口

Class[] intfs = clazz.getInterfaces();
Run Code Online (Sandbox Code Playgroud)


Rod*_*eas 10

您可以使用class.getInterfaces()然后检查接口类是否在那里.

Class someInterface; // the interface you want to check for 
Class x; // 
Class[] interfaces = x.getInterfaces();

for (Class i : interfaces) {
    if (i.toString().equals(someInterface.toString()) {
        // if this is true, the class implements the interface you're looking for
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是行不通的, getInterfaces() 仅在类直接实现接口时才有效,如果超类实现了该接口,或者超接口扩展了它,则 getInterfaces() 将不会返回该接口。您需要遍历所有超类和接口的树才能获取该类实现的所有接口。 (2认同)