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