字面量跟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个字节是属于该表的,我们接着看是0x000B
和0x001C
,也就是说他的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的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。