45

我创建了自己的注释类型,如下所示:

public @interface NewAnnotationType {}

并将其附加到一个类:

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

我试图通过这样的反射来获取类注释:

Class newClass = NewClass.class;

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

但它没有打印任何东西。我究竟做错了什么?

4

2 回答 2

53

默认保留策略RetentionPolicy.CLASS意味着,默认情况下,注释信息不会在运行时保留:

注释将由编译器记录在类文件中,但不需要在运行时由 VM 保留。这是默认行为。

相反,使用RetentionPolicy.RUNTIME

注释将由编译器记录在类文件中,并在运行时由 VM 保留,因此可以反射性地读取它们。

...您使用@Retention元注释指定:

@Retention(RetentionPolicy.RUNTIME)
public @interface NewAnnotationType {
}
于 2013-07-28T13:39:37.770 回答
0

Retention拥有注释的默认值并不意味着您不能在运行时阅读它。

自从

注释将由编译器记录在类文件中,但不需要在运行时由 VM 保留。这是默认行为。

可以直接读取文件来访问它们.class


这可以通过使用ASM库来完成(当然,处理一些极端情况)。

查看其出色的用户指南。特别是第 4.2 节注释。


您可能需要参考 Spring 框架对此类注释的处理(它使用阴影 asm 依赖项):

于 2019-11-18T19:38:51.893 回答