Section 4.7.16 of the JVM specification包含对“RuntimeVisibleAnnotations”的描述。我想知道什么会导致属性包含在此属性表中,这仅是通过在属性上应用@Retention(RetentionPolicy.RUNTIME)来实现的吗?相反,对于“RuntimeInvisibleAnnotations”(请参见4.7.17进一步),此@Retention(RetentionPolicy.CLASS)仅还是@Retention(RetentionPolicy.SOURCE)

最佳答案

从JVM和JLS规范中编译信息给我们以下图片:

用值为@RetentionRetentionPolicy.SOURCE进行元注释的

  • 批注一定不能出现在它们出现的类或接口(interface)的二进制表示中,即,它们根本不会记录在类文件中。
  • 带有RetentionPolicy.CLASS的注释必须用它们出现的类或接口(interface)的二进制表示形式表示,除非它们对局部变量声明进行注释。本地变量声明的注释永远不会保留在二进制表示形式中。

    这就是RuntimeInvisibleAnnotations属性的目的。

    除非已通过某种特定于实现的机制(例如命令行标志)指示Java虚拟机保留这些批注,否则VM无需在运行时保留它们。
  • 带有RetentionPolicy.RUNTIME的注释将由编译器记录在类文件中,并且必须在运行时通过反射库可用。这用于RuntimeVisibleAnnotations属性。
  • 关于java - RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations-如何从代码访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22936139/

    10-08 20:34