JVM(19)之 Class文件常量池
在上一博文Class文件中,我们了解了Class文件的一些基础知识。他的整个内部结构就是一张很大的表,我们就是从这张表入手,一一分析每个部分的结构。继续看这张表:
接着上一博文所说,魔数后面分别是次版本号和主版本号。由上图可知其分别占用两个字节。
被蓝色框框住的就是次版本号,划红线的就是主版本号。再次说明,Class文件内部的数据是按照规则紧凑排列的,中间不会有空隙。
接下来就是说明常量的个数了。代表着常量池中有多少个常量,由于常量池中的常量数量不确定,所以才会有这个数据项。依然看上图可知该数据项是占用2个字节,因此顺着主版本号往后面数两个字节得到:0x002E(16进制),即十进制的51,也就是说常量池中有50项常量,索引从1到50。
这里所指的常量与JAVA代码中所说的常量有所不同,这里的常量主要包括字面量和符号引用,这两个概念很好理解。
字面量跟JAVA代码中的常量概念类似,如字符串、常量的值等等。
符号引用指的是类与接口的全限定名、字段、方法的名词和描述符。可以暂时理解为类、接口、字段、方法的名字。这里我们来回忆一下类加载机制中的解析阶段:他是将符号引用转化为直接引用。直接引用指的就是可以直接指向目标的指针。可以粗略的理解为:符号引用只是用一些符号来描述他要引用的目标,而直接引用才是真正的指向了他要引用的目标。
在常量池中的每个数据项都是以表的形式存在的,这里每个表都会有一个标志位tag,来说明自己的是哪一类型的数据。如图:
我们来看我们的代码:
根据以上知识和代码,我们继续来看看Class文件接下来的数据。紧接着常量池数量之后的便是常量表了。刚刚也说了,每个表都会有一个一个字节的标志位,那么常量池数量0x002E之后一个字节便是0x0A,这个就是标志位,十进制是10,查表可知是个方法的符号引用。
他的表结构如下:
因此后面还有4个字节是属于该表的,我们接着看是0x000B和0x001C,也就是说他的CONSTANT_Class_info索引项是11;CONSTANT_NameAndType的索引项是28,也就是常量池中第11项常量和28项常量,我们这里就通过工具来看了。找到第11项常量,查看11项常量的表结构,继续使用刚刚那样的寻找方法,一直找到标志位为1的常量项,也就是CONSTANT_Utf8_info的表结构,这样就可以得出我们最开始查看的那个表结构的一些具体信息了。
如果觉得查看过程繁琐,可以采用javap -verbose Main来查看:
如上图:第1项有指向第11和28项的索引,他们的值分别是后面的字符串,代表的是一个默认的空的构造函数。
JVM(19)之 Class文件常量池的更多相关文章
- 【JVM】Class结构之常量池
常量池 主要包括下面2类: 字面量(Literal):如int,double,String等: 符号引用(Symbolic Reference): 符号引用 类和接口的全限定名: 字段的名称和描述符: ...
- jvm源码解读--04 常量池 常量项的解析CONSTANT_Class_info
接上篇的继续 ConstantPool* constant_pool = ConstantPool::allocate(_loader_data, length, CHECK_(nullHandle) ...
- jvm源码解读--03 常量池的解析ConstantPool
先看bt栈 (gdb) bt #0 ConstantPool::allocate (loader_data=0x7fe21802e868, length=87, __the_thread__=0x7f ...
- jvm源码解读--05 常量池 常量项的解析JVM_CONSTANT_Utf8
当index=18的时候JVM_CONSTANT_Utf8 case JVM_CONSTANT_Utf8 : { cfs->guarantee_more(2, CHECK); // utf8_l ...
- Java中的常量池
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...
- Class文件内容及常量池
当JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中.那么这个class文件里面到底有些什么内容呢? 一.class文件内容概述 ...
- 超过1W字深度剖析JVM常量池(全网最详细最有深度)
面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对 ...
- 【JVM】Java 8 中的常量池、字符串池、包装类对象池
1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...
- JVM详解之:运行时常量池
目录 简介 class文件中的常量池 运行时常量池 静态常量详解 String常量 数字常量 符号引用详解 String Pool字符串常量池 总结 简介 JVM在运行的时候会对class文件进行加载 ...
随机推荐
- 【leetcode】1103. Distribute Candies to People
题目如下: We distribute some number of candies, to a row of n = num_people people in the following way: ...
- LeetCode--075--颜色分类(python)
给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. ...
- mysql CHECK约束 语法
mysql CHECK约束 语法 作用:CHECK 约束用于限制列中的值的范围. 直线电机 说明:如果对单个列定义 CHECK 约束,那么该列只允许特定的值.如果对一个表定义 CHECK 约束,那么此 ...
- Java——this
[this] 在没有new一个对象前,this不知道指的是什么:当new出一个对象时,this指的是当前对象的引用.
- C# 内存建表备忘
#region=====建表===== DataSet dataSet; // 创建表 DataTable table = new DataTable("testTable"); ...
- 深入理解webpack基本配置(一)
1. 安装webpack到全局 在学习构建之前,我们来在本地文件新建一个存放项目的文件夹,比如叫demo1这个项目,然后进入demo1该项目的根目录后,执行命令 npm init运行下,一路回车(先简 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第5节 StringBuilder类_1_StringBuilder的原理
字符串不可变.字符串的缓冲区是可以变的 字符串Sting的底层,被final修饰的不可变的数组 a+b+c最终会产生5个字符串
- AWK之随心所欲-基础篇
一.简介 awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件.数据排序.计算以及 生成报表等等. 在 Linux 系统下默认 awk 是 gawk,它是 awk 的 GNU 版本. ...
- MM理论
最初的MM理论,即由美国的Modigliani和Miller(简称MM)教授于1958年6月份发表于<美国经济评论>的“资本结构.公司财务与资本”一文中所阐述的基本思想.该理论认为,在不考 ...
- loadrunner+win2003虚拟机的安装
lr11的安装和使用 准备材料: 1.win2003镜像下载 2.虚拟机下载 3.lr11的下载 一.创建win2003虚拟机 打开虚拟机,选择win2003系统镜像,输入密钥(可百度),用户名密码( ...