4

我正在尝试编写类似框架的东西。我需要在我的计算机上搜索特定的文件夹,并能够获得所有实现我的接口的类文件。虽然我知道如何扫描文件夹并以某种方式检查所有类文件,但我无法检查读取类是否实现了我的接口。

if (Game.class.isAssignableFrom(classInFolder))
    {
        //Do sth here
}

这是我尝试过的一种方法,但它从不跳入 if 子句 - 游戏是我的界面

public interface Game {

public void startAlgorithm();

}

classInFolder 是我从文件夹中获得的 Class。有趣的是,如果我尝试对某些库接口做同样的事情 - 假设 Serializable 它工作正常 - 我试过了。更何况我写了这样的东西

Type[] type = classInFolder.getGenericInterfaces();
for (int i = 0;i<type.length;++i)
{
    System.out.println("interface = " + type[i]);
    if (type[i] instanceof Game){
    System.out.println("It is");
    }
}

我得到了我的控制台输出 - interface = mypackage.Game 但是没有“它是”输出。同样的事情是在我尝试使用的类上使用我自己的注释 - 我无法检查我的类是否实现了我的接口,但是当这些是来自某个库的接口时它可以工作。我将我的项目部署在 tomcat v 7.0 上,一切都是使用 Spring 在 Eclipse 上的 Java 7 上构建的。

对于可能发生的事情,我将不胜感激。

4

4 回答 4

2

我怀疑你用不同ClassLoader的 s 加载你的类。由一个类加载器加载的类与由不同类加载器加载的同一类不同。

尝试使用相同的ClassLoader.


Object a1 = new ClassLoader() {}.loadClass("A");
Object a2 = new ClassLoader() {}.loadClass("A");

return a1.getClass().equals(a2.getClass());

将返回false

于 2012-11-12T15:47:14.417 回答
2

您的示例中没有“It is”输出,因为您应该在 instanceof 运算符左侧使用所需类的实例,而您在那里使用 Type 实例。

尝试使用Class.getInterfaces()获取类实现的接口,并在 getInterfaces() 方法返回的数组中查找您的接口。

于 2012-11-12T15:49:44.427 回答
2

使用instanceof运算符,您正在检查对象实例而不是接口。

要检查接口,请尝试获取接口,因为可能有多个,迭代列表并匹配如下类型:

        for (Class ifce : type[i].getClass().getInterfaces()) {
           if (ifce.equals(Game.class)) {
                System.out.println("It is");
           }
         }
于 2012-11-12T15:56:27.327 回答
1

您的Game类可能是由 tomcat 类加载器加载的。

classInFolder可能是由您自己的自定义类加载器加载的。

您需要确保第一个加载器是第二个加载器的父级

ClassLoader parent = Game.class.getClassLoader();

new MyClassLoader(parent, ...)
于 2012-11-12T16:49:00.393 回答