Class#isAnnotationPresent不起作用

时间:2013-03-02 12:43:16

标签: java reflection annotations

我正在搜索一个类列表来检查一个类是否有一个Annonation。这是代码:

                        if (clazz.getAnnotations().length > 0){
                            System.out.println(clazz.getAnnotations()[0]);
                        }
                        if (clazz.isAnnotationPresent(Manifest.class)){
                            System.out.println(clazz.getName());
                        }

第一个if语句仅用于调试。一类打印:

@bot.script.Manifest(description=test, version=1.0, name=test)

这与Manifest.class完全相同,但为什么clazz.isAnnotationPresent不起作用?

1 个答案:

答案 0 :(得分:1)

从评论中看,你看起来有几个类加载器。带注释的类及其Manifest注释由第一个类加载器加载,并且在您的问题中包含if测试的类由第二个类加载器加载,并使用第二个类加载器重新加载Manifest类。

因此,您测试Manifest.class是否与clazz.getAnnotations()[0]相同,而它们不是,因为虽然它们具有相同的名称,但它们是两个不同的类,因为它们由两个不同的类加载装载机。

很难告诉您如何解决问题,因为我们不知道您的应用程序做了什么,它是如何做到的以及在哪种环境中。但是你应该确保只有一个类加载器可以加载该类。

例如,如果在webapp中运行,该类应该在容器的claspath中,或者在webapp的类路径中(WEB-INF / classes和WEB-INF / lib / xxx.jar),但不能同时在两者中。 / p>