如何在java中获取类注释?

时间:2013-07-28 13:35:58

标签: java reflection annotations

我已经创建了我自己的注释类型:

public @interface NewAnnotationType {}

并将其附加到班级:

@NewAnnotationType
public class NewClass {
    public void DoSomething() {}
}

我尝试通过这样的反射得到类注释:

Class newClass = NewClass.class;

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

但它不打印任何东西。我做错了什么?

2 个答案:

答案 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依赖项):