JVM进阶(十九)——Class文件常量池_class 常量池 目标方法

字面量跟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项的索引,他们的值分别是后面的字符串,代表的是一个默认的空的构造函数。

查看跟踪的过程比较枯燥无味,但这也是我们深入了解虚拟机的一个非常重要的基础,大家可查阅更多的相关资料进行学习,有困难,迎难而上才会成长!
这里写图片描述

总结

=============================================================

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;如果因为我的笔记太过简陋不理解,可以关注我以后我还会继续分享。

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值