如何在java中获取类注释?

2022-09-01 00:36:31

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

public @interface NewAnnotationType {}

并将其附加到一个类:

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

我试图通过反射获得类注释,如下所示:

Class newClass = NewClass.class;

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

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


答案 1

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

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

相反,请使用 RetentionPolicy.RUNTIME

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

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

@Retention(RetentionPolicy.RUNTIME)
public @interface NewAnnotationType {
}

答案 2

具有默认值的批注并不意味着您无法在运行时读取它。Retention

因为

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

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


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

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


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