我正在搜索一个类列表来检查一个类是否有一个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不起作用?
答案 0 :(得分:1)
从评论中看,你看起来有几个类加载器。带注释的类及其Manifest注释由第一个类加载器加载,并且在您的问题中包含if
测试的类由第二个类加载器加载,并使用第二个类加载器重新加载Manifest类。
因此,您测试Manifest.class
是否与clazz.getAnnotations()[0]
相同,而它们不是,因为虽然它们具有相同的名称,但它们是两个不同的类,因为它们由两个不同的类加载装载机。
很难告诉您如何解决问题,因为我们不知道您的应用程序做了什么,它是如何做到的以及在哪种环境中。但是你应该确保只有一个类加载器可以加载该类。
例如,如果在webapp中运行,该类应该在容器的claspath中,或者在webapp的类路径中(WEB-INF / classes和WEB-INF / lib / xxx.jar),但不能同时在两者中。 / p>