`
bolinyang
  • 浏览: 76060 次
  • 性别: 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
分享到:
评论

相关推荐

    阿里P8 架构师整理Java学习笔记.pdf

    - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程**: 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程...

    java 面试题 总结

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...

    java范例开发大全源代码

     实例154 使用静态成员变量计算内存中实例化的对象数目 239  实例155 实现加减乘除的方法 240  8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  ...

    java范例开发大全

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂...

    Java范例开发大全 (源程序)

     实例154 使用静态成员变量计算内存中实例化的对象数目 239  实例155 实现加减乘除的方法 240  8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158...

    Java范例开发大全(全书源程序)

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会...

    java范例开发大全(pdf&源码)

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    2021-2022计算机二级等级考试试题及答案No.18392.docx

    `javap` 是 Java Platform 编程工具的一部分,用于展示类文件中的内容,包括常量池、字段、方法等,并可以反汇编字节码。例如: - **用途**:`javap` 常用于调试和学习 Java 字节码。 - **示例**:`javap -c MyClass...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

Global site tag (gtag.js) - Google Analytics