【问题标题】:How to get class annotation in java?如何在java中获取类注释?
【发布时间】:2013-07-28 13:35:58
【问题描述】:

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

public @interface NewAnnotationType {}

并将其附加到一个类:

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

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

Class newClass = NewClass.class;

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

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

【问题讨论】:

  • 除非明确标记,否则注释仅在编译时可用。

标签: java reflection annotations


【解决方案1】:

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

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

改为使用RetentionPolicy.RUNTIME:

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

...您使用@Retention meta-annotation 指定:

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

【讨论】:

  • 如果我想使用外部 jar 中的注释类型怎么办?我尝试以相同的方式进行操作,但没有成功。即使将 RetentionPolicy 设置为 SOURCE 也无济于事。有什么想法吗?
  • 您为什么认为使用RetentionPolicy.SOURCE 会有所作为? JavaDoc 明确表示这意味着“注释将被编译器丢弃”。无论如何,您需要进一步详细说明确切的问题设置;我看不出使用外部 JAR 有什么不同。这可能最好在一个新的、单独的问题中提出。
【解决方案2】:

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

自从

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

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


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

查看其出色的User guide。特别是第 4.2 节注释。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多