class文件详解之直接引用和符号引用

符号引用(class文件中)

在Java中,一个java类将会编译成- 一个class文件。在编译时,java类 并不知道所引用的类的实际地址,因此只能使用签号引用来代替。

比如org. simple.People类引用了org.simple.Language类,在编译时People类 并不知道Language类的实际内存地址,因此只能使用符号org.simple,.Language (假设是这个,当然实际中是由类似于,CONSTANT Class info的常量来表示的)来表示Language类的地址。

直接引用(运行时内存中)

直接引用可以是:
1.直接指向且标的指钍(比如,指向“类型”[Class对象] 、类变量、类方法的直接引用可能是指向方法区的指针)
2.相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
3.一个能间接定位到且标的句柄。

直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。

引用替换的时机

1、类加载的解析阶段(需要将一部分符 号引用转换为直接引用)符号引用替换为直接引用的操作发生在类加载过程(加载->连接(验证、准备、解析) ->初始化)中的解析阶段,会将符号引用转换(替换)为对应的直接引用,放入运行时常量池中。
2、运行期间(动态分派)

你可能感兴趣的:(class文件详解之直接引用和符号引用)