java class.getAnnotation(Class <!-?-> class)返回null

时间:2018-06-28 14:33:08

标签: java reflection osgi classloader

我写了一个注释:

@Documented
@Retention(RUNTIME)
@Target(TYPE)
/**
 * @author christian
 *
 */
public @interface HeraklesObject {

}

我在成捆的osgi环境中(用tyty遮盖氧气)使用它。 在另一个捆绑包中(具体来说是一个测试片段),我使用以下方法检查第一个捆绑包中的类是否有此注释:

class.getAnnotation(HeraklesObject.class)

我确定所查询的类具有此批注,但结果始终为空。

保留策略对我来说似乎是正确的,但是我不确定是否存在类加载器问题,并且我不知道如何检查。还是看到其他原因?谢谢 基督徒

2 个答案:

答案 0 :(得分:0)

尝试使用

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })

也来自How to get class annotation in java?

使用

Class newClass = X.class;

for (Annotation annotation : newClass.getDeclaredAnnotations()) {
    System.out.println(annotation.toString());
}

答案 1 :(得分:0)

您要检查其运行时批注的类的包是否包含或导入带有HeraklesObject批注类的包?

类加载器将加载一个类,如果运行时注释类的类不可见,则忽略该注释。因此,您最终会遇到无声的“失败”。因此,请检查以确保包含运行时注释的包对包含带注释的类的包可见。

如果您使用Bnd生成捆绑包,则它应正确导入运行时批注的包。