JVM虚拟机中Class文件的常量池是什么


这期内容当中小编将会给大家带来有关JVM虚拟机中Class文件的常量池是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置:常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,它还是在Class文件中第一个出现的表类型数据项目。常量池的结构比较简单,前面的两个字节叫做常量池计数器(constantpoolcount),它记录了常量池项(cpinfo)的个数。后面紧接着就是constantpoolcount-1常量池项(cpinfo)。这跟报文通信协议比较类似,首先定义报文的大小,接着就是对应大小的报文内容。由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constantpoolcount)。与Java中语言习惯不同,这个容量计数是从1而不是0开 香港云主机始的,如上图所示,常量池容量(偏移地址:0x00000008)为十六进制数0x0021,即十进制的33,这就代表常量池中有33项常量,索引值范围为1~33。在Class文件格式规范制定之时,设计者将第0项常量空出来是有特殊考虑的,这样做的目的在于,如果后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义,可以把索引值设置为0来表示。Class文件结构中只有常量池的容量计数是从1开始,对于其他集合类型,包括接口索引集合、字段表集合、方法表集合等的容量计数都与一般习惯相同,是从0开始。常量池中主要存放两大类常量: 字面量(Literal)和符号引用(SymbolicReferences)。字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等;而符号引用则属于编译原理方面的概念。具体分类如下图:常量池中每一项常量都是一个表,最初常量表中共有11种结构各不相同的表结构数据,后来为了更好地支持动态语言调用,额外增加了4种动态语言相关的常量,为了支持Java模块化系统 (Jigsaw),又加入了CONSTANTM oduleinfo和CONSTANTPackageinfo两个常量,所以截至JDK 13,常量表中分别有17种不同类型的常量。这17类表都有一个共同的特点,表结构起始的第一位是个u1类型的标志位(tag,取值见下表中标志列),代表着当前常量属于哪种常量类型。官网最新:http://cr.openjdk.java.net/~jrose/jvm/constant-dynamic-jrose.html我们对这个class文件进行分析,可以看到前8个字节是该class文件的魔数和版本号,紧接着的一个十六进制数0x0021,即十进制的33,这就代表z这个class文件的常量池中有32项常量,索引值为1~32。然后就是第一个常量了,上面说过,每种类型的常量开始的第一位都是一个u1类型的标志位,代表该常量的类型,这里是0x0a,十进制的10,查上面的表可知是CONSTANTMethodrefinfo,说明这个常量是类中方法的符号应用。该类型常量的具体结构为:第一个index值为0x0004,即指向常量池中的第4个常量,第二个index是0x0019,即指向常量池中的第25个常量。在JDK的bin目录中,Oracle公司已经为我们准备好一个专门用于分析Class文件字节码的工具:javap。我们可以用javap -verbose命令查看class文件的字节码内容。可以看到和我们分析的一致,该class文件中确实有32项常量,从#1到#32。上述就是小编为大家分享的JVM虚拟机中Class文件的常量池是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注开发云行业资讯频道。

相关推荐: Java中怎么增强一个类的功能

Java中怎么增强一个类的功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先第一种,直接在方法中写上要添加的功能,这种方式最不推荐,因为它违反了java代码“对扩展开放,对修改关闭”的原则,会…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/13 20:51
下一篇 08/13 20:51

相关推荐