



将常量池内的符号引用转换为直接引用的过程
事实上,解析操作往往会随着JVM在执行完初始化之后再执行
符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《Java虚拟机规范》的Class文件格式中,符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到了内存中
直接引用就是直接指向目标的指针,相对偏移量或一个间接定位到目标的句柄。直接引用是与虚拟机实现的内存布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用不会相同。如果有了直接引用,就说明引用的目标必定已经存在于内存之中了。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。
不过Java虚拟机规范并没有明确要求解析阶段一定要按照顺序执行。在HotSpot VM中,加载、验证、准备和初始化会按照顺序有条不紊地执行,但链接阶段中的解析操作往往会伴随着JVM在执行完初始化之后再执行
符号引号有:类和接口的权限定名、字段的名称和描述符、方法的名称和描述符
符号引用和直接引用
1.会议室里有个空的位子没坐人,座位前写着xxx的座位(符号引用),后来xxx进来坐下去摘掉牌子(符号引用换成直接引用)
2.我们去做菜,看菜谱,步骤都是什么样的(这是符号引号),当我们实际上去做,这个过程是直接引用ex:
输出操作System.out.println()对应的字节码:invokevirtual #24 <java/io/PrintStream.println>
以方法为例,Java虚拟机为每个类都准备了一张方法表,将其所有的方法都列在表中,当需要调用一个类的方法的时候,只要知道这个方法在方法表中的偏移量就可以直接调用该方法。通过解析操作,符号引用就可以转变为目标方法在类中方法表中的位置,从而使得方法被成功调用。
![]()
原文:https://www.cnblogs.com/zoran0104/p/14928788.html