我已经创建了我自己的注释类型:
public @interface NewAnnotationType {}
并将其附加到班级:
@NewAnnotationType
public class NewClass {
public void DoSomething() {}
}
我尝试通过这样的反射得到类注释:
Class newClass = NewClass.class;
for (Annotation annotation : newClass.getDeclaredAnnotations()) {
System.out.println(annotation.toString());
}
但它不打印任何东西。我做错了什么?
答案 0 :(得分:46)
默认保留策略为RetentionPolicy.CLASS
,这意味着默认情况下,注释信息不会在运行时保留:
注释将由编译器记录在类文件中,但在运行时不需要由VM保留。这是默认行为。
相反,请使用RetentionPolicy.RUNTIME
:
注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射性地读取它们。
...您使用@Retention
meta-annotation指定了
@Retention(RetentionPolicy.RUNTIME)
public @interface NewAnnotationType {
}
答案 1 :(得分:0)
具有注释的默认Retention
并不表示,您无法在运行时阅读该注释。
自
注释应由编译器记录在类文件中 但不必在运行时由VM保留。这是默认行为。
可以直接访问它们 直接读取.class
文件
这可以通过使用ASM库(当然可以处理一些极端情况)来实现。
查看其出色的User guide。特别是第4.2节注释。
您可能希望参考Spring框架对此类注释的处理(它使用阴影的asm依赖项):