JVM进阶(十九)——Class文件常量池

JVM进阶(十九)——Class文件常量池JVM 进阶 十九 Class 文件常量池 在上一博文 JVM 进阶 十八 初识 Class 文件 中 我们了解了 Class 文件的一些基础知识 他的整个内部结构就是一张很大的表 我们就是从这张表入手 一一分析每个部分的结构 继续看这张表 接着上一博文所说 魔数后面分别是次版本号和主版本号 由上图可知其分别占用两个字节 被蓝色框框住的就是次版本号 划红线的就是主版本号 再次说明

接下来就是说明常量的个数了。代表着常量池中有多少个常量,由于常量池中的常量数量不确定,所以才会有这个数据项。依然看上图可知该数据项是占用2个字节,因此顺着主版本号往后面数两个字节得到:0x002E(16进制),即十进制的51,也就是说常量池中有50项常量,索引从1到50。

这里所指的常量与JAVA代码中所说的常量有所不同,这里的常量主要包括字面量和符号引用,这两个概念很好理解。

字面量跟JAVA代码中的常量概念类似,如字符串、常量的值等等。

符号引用指的是类与接口的全限定名、字段、方法的名词和描述符。可以暂时理解为类、接口、字段、方法的名字。这里我们来回忆一下类加载机制中的解析阶段:他是将符号引用转化为直接引用。直接引用指的就是可以直接指向目标的指针。可以粗略的理解为:符号引用只是用一些符号来描述他要引用的目标,而直接引用才是真正的指向了他要引用的目标。

public class Main { 
    private String name; private int age; public void setName(String nage) { 
    this.name = name; } public void getAge() { 
    return age; } public static void main (String[] args) { 
    Main m = new Main(); m.setName('No Silver Bullet'); System.out.println(m.getAge()); } } 

根据以上知识和代码,我们继续来看看Class文件接下来的数据。紧接着常量池数量之后的便是常量表了。刚刚也说了,每个表都会有一个一个字节的标志位,那么常量池数量0x002E之后一个字节便是0x0A,这个就是标志位,十进制是10,查表可知是个方法的符号引用。
他的表结构如下:
这里写图片描述
因此后面还有4个字节是属于该表的,我们接着看是0x000B0x001C,也就是说他的CONSTANT_Class_info索引项是11;CONSTANT_NameAndType的索引项是28,也就是常量池中第11项常量和28项常量,我们这里就通过工具来看了。找到第11项常量,查看11项常量的表结构,继续使用刚刚那样的寻找方法,一直找到标志位为1的常量项,也就是CONSTANT_Utf8_info的表结构,这样就可以得出我们最开始查看的那个表结构的一些具体信息了。






如果觉得查看过程繁琐,可以采用javap -verbose Main来查看:
这里写图片描述
如上图:第1项有指向第11和28项的索引,他们的值分别是后面的字符串,代表的是一个默认的空的构造函数。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220903.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:23
下一篇 2026年3月17日 下午7:23


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号