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)呢?
从JVM和JLS规范中编译信息为我们提供了以下图片:
带有元注释的注释,@Retention其值RetentionPolicy.SOURCE必须不出现在它们出现的类或接口的二进制表示中,即它们根本不会记录在类文件中.
带注释的注释RetentionPolicy.CLASS必须在它们出现的类或接口的二进制表示中表示,除非它们注释本地变量声明.局部变量声明的注释永远不会保留在二进制表示中.
所以这就是RuntimeInvisibleAnnotations属性的设计目标.
它们不需要在运行时由VM保留,除非已指示Java虚拟机通过某些特定于实现的机制(如命令行标志)保留这些注释.
带有注释的注释RetentionPolicy.RUNTIME将由编译器记录在类文件中,并且必须在运行时通过反射库提供.这是RuntimeVisibleAnnotations属性.