繁体   English   中英

为什么我不能检查我的类是否在Web应用程序中实现我自己的接口?

[英]Why can't I check whether my class implements my own interface at Web Application?

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

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

这是我试过的一种方法,但它永远不会跳进if子句 - Game是我的界面

public interface Game {

public void startAlgorithm();

}

和classInFolder是我从我的文件夹中获取的类。 有趣的是,如果我尝试用一​​些库接口做同样的事情 - 让我们说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但是没有“它是”输出。 同样的事情是我自己在我尝试使用的类上注释 - 我无法检查我的类是否实现了我的接口,但是当它们是来自某些lib的接口时它可以工作。 我在tomcat v 7.0上部署我的项目,所有内容都是在Eclipse上使用Spring构建在Java 7上的。

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

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

尝试使用相同的ClassLoader加载它。


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

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

将返回false

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

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

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

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

        for (Class ifce : type[i].getClass().getInterfaces()) {
           if (ifce.equals(Game.class)) {
                System.out.println("It is");
           }
         }

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

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

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

ClassLoader parent = Game.class.getClassLoader();

new MyClassLoader(parent, ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM