Section 4.7.16 of the JVM specification包含对“RuntimeVisibleAnnotations”的描述。我想知道什么会导致属性包含在此属性表中,这仅是通过在属性上应用@Retention(RetentionPolicy.RUNTIME)
来实现的吗?相反,对于“RuntimeInvisibleAnnotations”(请参见4.7.17进一步),此@Retention(RetentionPolicy.CLASS)
仅还是@Retention(RetentionPolicy.SOURCE)
?
最佳答案
从JVM和JLS规范中编译信息给我们以下图片:
用值为@Retention
的RetentionPolicy.SOURCE
进行元注释的
RetentionPolicy.CLASS
的注释必须用它们出现的类或接口(interface)的二进制表示形式表示,除非它们对局部变量声明进行注释。本地变量声明的注释永远不会保留在二进制表示形式中。这就是
RuntimeInvisibleAnnotations
属性的目的。除非已通过某种特定于实现的机制(例如命令行标志)指示Java虚拟机保留这些批注,否则VM无需在运行时保留它们。
RetentionPolicy.RUNTIME
的注释将由编译器记录在类文件中,并且必须在运行时通过反射库可用。这用于RuntimeVisibleAnnotations
属性。 关于java - RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations-如何从代码访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22936139/