JAVA中的符号引用
2017-07-28 11:02
92 查看
[1]符号引用(Symbolic References):
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
[2]直接引用:
直接引用可以是
(1)直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
(2)相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
(3)一个能间接定位到目标的句柄
直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。
示例
使用javap 解析class;
如上所示: 对于最后面的
0:getstatic #2 ;取常量区 标记为2的 #2 = Fieldref #4.#21 // A.val:I
该指令需要继续解析 #4 和#21 常量区,最后不断得到变量值;
而: 6:ldc #5,直接取到常量区5 的常量值;
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
[2]直接引用:
直接引用可以是
(1)直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
(2)相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
(3)一个能间接定位到目标的句柄
直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。
示例
import java.util.Random; public interface A { public static String name="PILOT"; public static int val = new Random().nextInt(); public double size=200.2; }
public class B{ public static int val = A.val; public static String name= A.name; }
使用javap 解析class;
如上所示: 对于最后面的
0:getstatic #2 ;取常量区 标记为2的 #2 = Fieldref #4.#21 // A.val:I
该指令需要继续解析 #4 和#21 常量区,最后不断得到变量值;
而: 6:ldc #5,直接取到常量区5 的常量值;
相关文章推荐
- Java字面量(Java直接量)和符号引用
- java 符号引用与直接引用
- JSP中几种引用java代码的符号
- java Class 加载过程 符号引用 直接引用
- JAVA class文件中的符号引用
- JAVA class文件中的符号引用
- JAVA基础——对象与引用概念(转载)
- /*设计一个鼠标点击速度比赛游戏。 *(1)显示一个按钮和文本框。 *(2)文本框显示鼠标点击次数*/ import javax.swing.*;//引用 import java.awt.*; i
- java的引用总结
- Java引用对象SoftReference、WeakReference简单介绍
- Java中的四种引用
- Java垃圾回收机制与引用类型(转)
- error LNK2019: 无法解析的外部符号_cvReleaseImage,该符号在函数_main 中被引用
- java对象的强引用,软引用,弱引用和虚引用
- C++,Java值传递,引用传递
- java基本类型和引用类型
- Java基础——引用类型转换
- 无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用
- Java 2 引用类使用指南
- Java基础 之软引用、弱引用、虚引用