class文件常量池与运行时常量池_java运行时常量池

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在上一博文《JVM进阶(十八)——初识Class文件》中,我们了解了Class文件的一些基础知识。他的整个内部结构就是一张很大的表,我们就是从这张表入手,一一分析每个部分的结构。继续看这张表:
这里写图片描述
接着上一博文所说,魔数后面分别是次版本号和主版本号。由上图可知其分别占用两个字节。
这里写图片描述
被蓝色框框住的就是次版本号,划红线的就是主版本号。再次说明,Class文件内部的数据是按照规则紧凑排列的,中间不会有空隙。

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

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

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

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

在常量池中的每个数据项都是以表的形式存在的,这里每个表都会有一个标志位tag,来说明自己的是哪一类型的数据。如图:
这里写图片描述
我们来看下面的代码:

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/195534.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux-dosbox使用「建议收藏」

    2019独角兽企业重金招聘Python工程师标准>>>…

    2022年4月9日
    139
  • linux嵌入式系统的缺点,arm嵌入式主板的优缺点

    嵌入式主板是嵌入在设备里面做控制、数据处理使用的CPU板,常见的有两类,即基于X86的嵌入式主板和基于RISC的ARM嵌入式主板。今天我们就来认识arm嵌入式主板,arm嵌入式主板就是一个嵌入在设备里面做控制、数据处理使用的CPU板。一般作为工控主板使用。ARM处理器是一种16/32位的嵌入式RISC微处理器,具有低成本、高性能、低功耗的特点。ARM9系列微处理器具有以下特点:支持32位ARM…

    2022年4月9日
    86
  • ideal2019 30天试用结束了,在线激活码【最新永久激活】

    (ideal2019 30天试用结束了,在线激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2JTX0APX6F-eyJsa…

    2022年3月30日
    42
  • 区块链每日快讯(0122)[通俗易懂]

    区块链每日快讯(0122)

    2022年3月13日
    55
  • 配对t检验的应用条件是什么_配对t检验在实际工作中的应用[通俗易懂]

    配对t检验的应用条件是什么_配对t检验在实际工作中的应用[通俗易懂](r:相关系数)双样本t时用此公式计算标准误:→三、成组t检验:适用于完全随机设计的两均值比较,要求个体之间相互独立,两组资料均服从正态分布且方差齐性,即为标准的双样本t检验。四、我们重点来看一下,配对t检验,配对t检验从设计上分为3种情况,如下:1、自身配对设计:选择K个受试者,分别在甲、乙两个不同的试验条件(即某个因素的两个水平)下,测出每个受试者同一个指标的两个数值,并把它们配成一对。2、同…

    2022年6月19日
    52
  • ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口

    ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?1.1描述SFTP(SSHFileTransferProtocol)即安全文件传送协议),是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。sftp是基于ssh上实现的,所以严格来说我们是无法来关闭ssh,而只是使用sftp。ssh…

    2025年11月15日
    2

发表回复

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

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