请教常量池中入口的顺序
blizzard213
2012-08-20
读深入Java虚拟机(第二版本)的第六章Java class文件中最后一个例子时,发现使用jdk6编译出来的class文件中的常量池的入口顺序和书上的不一致
书上是: 1 CONSTANT_Class_info 2 CONSTANT_Class_info 3 CONSTANT_Methodref_info .. .. jdk6编译出来的是: 1 CONSTANT_Methodref_info 2 CONSTANT_Class_info 3 CONSTANT_Class_info 个人感觉这个虽然无关紧要,但是想知道入口顺序是否规定还是随机的? 论坛中有朋友疑问探讨这个问题是否有意义,但是我还是想知道 |
|
RednaxelaFX
2012-08-21
入口…那个是翻译错误,原文是entry。Constant pool entry的正确译法是“常量池项”
常量池项的顺序没有特别意义。你试试用ECJ(Eclipse Compiler for Java)编译,得到的Class文件里的常量池项顺序也不一样。没关系的。JVMS对此没有强制的规定。 至于为啥会不一样,这取决于生成这个class文件的程序的实现。通常生成class文件的是Java源码编译器,而通常这里面有记录编译单元内使用到的符号的符号表,通常在编译的最终阶段生成class文件的时候会遍历这个符号表来生成常量池内容。假如这个符号表是一个无序的hash容器,那遍历的时候顺序是怎样的就不确定了(反正也没关系);如果两个编译器分别用了不同实现的hash容器来做符号表,那它们生成出来的class文件里的常量池项顺序就会不一样。这只是一种可能产生差异的地方,其它可能性还有很多,不一一列举。 |
|
blizzard213
2012-08-21
谢谢RednaxelaFX清晰的解答,我了解了。
|