RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations - 如何从代码访问?

Mis*_*hax 4 java attributes jvm annotations

JVM规范的4.7.16节包括"RuntimeVisibleAnnotations"的描述.我想知道什么可以导致属性被包含在这个属性表中,这只是通过应用@Retention(RetentionPolicy.RUNTIME)属性?相反,对于"RuntimeInvisibleAnnotations"(见4.7.17中的进一步说明)是这个@Retention(RetentionPolicy.CLASS)还是它@Retention(RetentionPolicy.SOURCE)呢?

Eug*_*mov 5

从JVM和JLS规范中编译信息为我们提供了以下图片:

  1. 带有元注释的注释,@Retention其值RetentionPolicy.SOURCE必须不出现在它们出现的类或接口的二进制表示中,即它们根本不会记录在类文件中.

  2. 带注释的注释RetentionPolicy.CLASS必须在它们出现的类或接口的二进制表示中表示,除非它们注释本地变量声明.局部变量声明的注释永远不会保留在二进制表示中.

    所以这就是RuntimeInvisibleAnnotations属性的设计目标.

    它们不需要在运行时由VM保留,除非已指示Java虚拟机通过某些特定于实现的机制(如命令行标志)保留这些注释.

  3. 带有注释的注释RetentionPolicy.RUNTIME将由编译器记录在类文件中,并且必须在运行时通过反射库提供.这是RuntimeVisibleAnnotations属性.