这些天来,我一直在玩 Java 反射和.class
格式。我目前正在学习ldc
教学。
在 JVM Specification 我发现术语我不明白:符号引用,我有以下问题。
这是什么意思?
它在哪里使用?
- 在哪些情况下
ldc
指令会加载符号引用? - Java中是否有与该操作相对应的任何代码?
这些天来,我一直在玩 Java 反射和.class
格式。我目前正在学习ldc
教学。
在 JVM Specification 我发现术语我不明白:符号引用,我有以下问题。
这是什么意思?
它在哪里使用?
ldc
指令会加载符号引用?如果您能引用给您带来麻烦的文档的确切部分,那将会很有帮助。既然你还没有,我将从ldc的文档中猜测你可能引用的内容:
否则,如果运行时常量池条目是对类的符号引用(第 5.1 节),则解析命名类(第 5.4.3.1 节),并将对表示该类的 Class 对象的引用(值)推送到操作数栈。
否则,运行时常量池条目必须是对方法类型或方法句柄的符号引用(第 5.1 节)。...
这个引用有一个链接到 JVM 规范(5.1)的另一部分,它描述了运行时常量池:
一种运行时数据结构,可用于传统编程语言实现的符号表的许多目的
这意味着运行时常量池以符号形式包含有关类片段的信息:作为文本值。
因此,当ldc
给定一个类的“符号引用”时,它会获得CONSTANT_Class_info
常量池中结构的索引。如果您查看此结构的定义,您会发现它包含对类名称的引用,该类名称也保存在常量池中。
TL;DR: “符号引用”是可用于检索实际对象的字符串。
一个例子:
if (obj.getClass() == String.class) {
// do something
}
变成以下字节码:
aload_1
invokevirtual #21; //Method java/lang/Object.getClass:()Ljava/lang/Class;
ldc #25; //class java/lang/String
if_acmpne 20
在这种情况下,ldc
操作是指一个以符号方式存储的类。当 JVM 执行此操作码时,它将使用符号引用来识别当前类加载器中的实际类,并返回对类实例的引用。