`
bolinyang
  • 浏览: 74191 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA字节码常量池中常量数目的疑问

    博客分类:
  • JVM
JVM 
阅读更多
一.问题的提出
     我们看看JAVA的CLASS文件,发现这个文件的结构非常严谨,首先是魔数,魔数表明这个文件到底是不是JAVA翻译过来的CLASS文件,其实就是文件格式的表示,接下来就是JAVA的次版本号和主版本号,那么紧接着这个版本号就是常量区,常量区的第一个和第二个字节表示这个常量区中有多少个常量,今天使用vi编辑器打开一个class文件,然后%!xxd以二进制的方式查看,发现这个class文件的常量区开头有0x0057个常量,也就是说有87个常量,然后我使用javap -verbose反编译之后发现常量区中只有86个常量,少了一个常量,这怎么解释呢?
二.问题的解决
      其实这个问题是自己最近在用JAVA程序解析CLASS文件的时候遇到的,带着这个疑问,我自己跑了一遍自己的解析程序,发现在解析常量区的时候,解析出来的常量数目也是比实际的常量数目少一个,这是程序跑出来的现像。
   CLASS文件中常量区包含很多常量,这些常量有自己的数据结构,总共有11种常量数据结构,每种数据结构都有一个共同的字段tag,tag的取值是[1,3,4,5,6,7,8,9,10,11,12],很明显缺少了0和2,这里为什么不用2我也不清楚,这里0存在的意义就是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达"不引用任何一个常量池项目"的意思。但是这里的2怎么解释我至今也没弄清楚。所以87个常量是从1到86,和我们程序中的数组下标有点不一致,数组下标是从0开始的,而这里的常量索引是从1开始的,二者都不包含最后一个。

三.最后结论
       如果我们通过分析CLASS文件的二进制形式,发现常量区有N个常量,那么使用javap反编译出来的结果中只有N-1个常量,在常量池中,这N-1常量的索引从1到N-1
  • 大小: 15.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics