【问题标题】:Java - Why annotation is not retained on local variable declaration in .class file?Java - 为什么在 .class 文件中的局部变量声明中不保留注释?
【发布时间】:2019-05-03 15:13:36
【问题描述】:

我正在阅读 Herber Schildt 的 Java 参考。我在其中一个注释部分发现了一条注释:

.class 文件中不保留局部变量声明上的注释。

为什么.class文件中的局部变量声明不保留注解?

【问题讨论】:

  • 我的猜测是因为它只存在于那个范围内,所以它在它的范围之外是不可见的。
  • 您使用反射 API 访问注解;你不能通过反射访问局部变量。
  • @AndyTurner - 仅适用于带有RetentionPolicy.RUNTIME 的注释;还有SOURCECLASS 政策。

标签: java java-annotations


【解决方案1】:

要了解具体原因,您需要与设计该功能的人员交谈。

但是,作为一般背景,请了解实际上可以通过 RetentionPolicy 元注释来处理注释的三种不同方式(是的,我有意选择了 1.5 JavaDoc):

  • SOURCE 表示注解只存在于源码中,根本没有写入classfile。它适用于更改编译器行为的注释,但对正在运行的程序根本不重要。
  • RUNTIME 表示注解以一种通过反射对程序可见的方式写入类文件。正如 cmets 中所述,您无法反映局部变量。
  • CLASS 表示注解以not visible to the program 的方式写入类文件。但是,它们可以被字节码分析器或类加载器读取。

注释作为类、方法或字段的属性出现在类文件中。自定义类文件格式以来,就一直存在附加到这些实体的属性表的想法,因此向它们添加注释很容易。但是,LocalVariableType 没有每个变量的属性。

因此,我推测 JVM 的架构师认为仅加载时局部变量注释的好处不值得对用于管理局部变量表的数据结构进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多