0

我正在搜索类列表以检查类是否具有 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 不起作用?

4

1 回答 1

1

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

因此,您测试 ifManifest.class是否与 相同clazz.getAnnotations()[0],但它们不是,因为尽管它们具有相同的名称,但它们是两个不同的类,因为它们由两个不同的类加载器加载。

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

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

于 2013-03-02T13:27:28.150 回答