constant pool 的符号连接,需要转换成真正的数据存放地址。
原来的符号连接由数据的地址代替: symbolic referenc converted into a direct reference
一、 如: 类变量 choice :涉及3个符号连接
1> 9 CONSTANT_Methodref_info 7, 16:类变量初始化默认方法<clinit();
2> 10 CONSTANT_Fieldref_info 4, 17:存放类变量值得地方
3> 13 CONSTANT_Methodref_info 6, 20 :这就是类变量取得值得方法。
现在代码放在:1》<clinit()方法里面开始执行。 pc 指向下一条执行指令,开始执行类变量的方法<clinit(),
2》调用类变量取得值得方法
3》数据返回值地址给CONSTANT_Fieldref_info #10。
这就是一个symbolic referenc ,转换成真正数据的地址。
Salutation程序main 可以开始使用 类变量 的值了。
二、 Resolution of CONSTANT_String_info:静态常量字符串的转换。
1、an instance of class java.lang.String:a String object
String s=hello; ldc #2
1》、jvm 查看 constant pool 序号2,发现CONSTANT_String_info 还没有建立对象。
2》、jvm creates and interns a new String object with the value "Hello, world!".
3》、把对象的地址放入#2中。
2、s.intern():为了少建立String object 而出现。