fenixsoft / jvm_book

《深入理解Java虚拟机(第3版)》样例代码&勘误
1.35k stars 222 forks source link

关于 ConstantValue 属性赋值给字段的时机问题 #187

Open fanofxiaofeng opened 2 years ago

fanofxiaofeng commented 2 years ago

在 第3版 《深入理解Java虚拟机》一书的 7.3.3 “准备” 这一小节里,有和 ConstantValue 相关的描述 (在第272页)

image

我在最新的 Java 虚拟机规范里看到了 ConstantValue 属性的相关介绍(具体位置是 4.7.2. The ConstantValue Attribute

image

我把关键的那句话复制过来了

If the ACC_STATIC flag in the access_flags item of the field_info structure is set, then the field represented by the field_info structure is assigned the value represented by its ConstantValue attribute as part of the initialization of the class or interface declaring the field (§5.5). This occurs prior to the invocation of the class or interface initialization method of that class or interface (§2.9.2).

从引文来看,用 ConstantValue 属性的值给字段赋值应该是发生在初始化(initialization)阶段(而非准备阶段),且其执行时间早于 <clinit>

fanofxiaofeng commented 2 years ago

《深入理解Java虚拟机》 这本书给了我很多帮助,不过在这个小点上,似乎是有点表述错误