JVM加载机制详解(5)
2023-05-02 来源:飞速影视
用javap把这段代码的.class反编译一下:
Constant pool: #1 = Class #2 // com/xrq/test6/TestMain #2 = Utf8 com/xrq/test6/TestMain #3 = Class #4 // java/lang/Object #4 = Utf8 java/lang/Object #5 = Utf8 i #6 = Utf8 I #7 = Utf8 d #8 = Utf8 D #9 = Utf8 <init> #10 = Utf8 ()V #11 = Utf8 Code #12 = Methodref #3.#13 // java/lang/Object."<init>":()V #13 = NameAndType #9:#10 // "<init>":()V #14 = Utf8 LineNumberTable #15 = Utf8 LocalVariableTable #16 = Utf8 this #17 = Utf8 Lcom/xrq/test6/TestMain; #18 = Utf8 print #19 = Utf8 trueOrFalse #20 = Utf8 ()Z #21 = Utf8 SourceFile #22 = Utf8 TestMain.java
看到Constant Pool也就是常量池中有22项内容,其中带"Utf8"的就是符号引用。比如#2,它的值是"com/xrq/test6/TestMain",表示的是这个类的全限定名;又比如#5为i,#6为I,它们是一对的,表示变量时 Integer(int)类型的,名字叫作i;#6为D、#7为d也是一样,表示一个Double(double)类型的变量,名字为d; #18、#19表示的都是方法的名字。那其实总而言之,符号引用和我们上面讲的是一样的,是对于类、变量、方法的描述。符号引用和虚拟机的内存布局是没有关系的,引用的目标未必已经加载到内存中了。 什么是直接引用? 直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是和虚拟机实现的内存布局相关的,同一个符号引用在不同的虚拟机示例上翻译出来的直接引用一般不会相同。
如果有了直接引用,那引用的目标必定已经存在在内存中了。 解析阶段负责把整个类激活,串成一个可以找到彼此的网,过程不可谓不重要。那这个阶段都做了哪些工作呢?大体可以分为:
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号