java 类定义 (docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html) 如下所示:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
但是为什么constant_pool的计算结果是constant_pool_count-1呢?为什么减少了1?我希望它是constant_pool[constant_pool_count]而不是constant_pool[constant_pool_count-1]。
因为根据您发布的文档:
constant_pool_count项的值等于constant_pool表中的条目数加一
因此
constant_pool[constant_pool_count]
会导致索引无效。
至于背后的原因——我只能在这里猜测。大概是因为选择了以
1
开头的索引而不是 0
。
可以看到,constant_pool是从1开始索引的,而不是0,这有点违反常理,但是这是为了“不引用任何常量值项”的意思,对于指向a中常量池索引值的数据特殊情况,可以用索引值0
来表示