Java 中的符号引用

在这些日子里,我一直在玩Java反射和格式。我目前正在学习教学。.classldc

在JVM规范中,我发现了我不理解的术语:符号引用,我有以下问题。

  1. 这是什么意思?

  2. 它在哪里使用?

  3. 在哪些情况下,指令加载符号引用?ldc
  4. Java中是否有任何与该操作相对应的代码?

答案 1

如果您引用给您带来麻烦的文档的确切部分,那将很有帮助。既然你没有,我将猜测你可能从ldc的文档中引用的内容:

否则,如果运行时常量池条目是对类 (§5.1) 的符号引用,则将解析命名类 (§5.4.3.1),并将对表示该类 value 的 Class 对象的引用推送到操作数堆栈上。

否则,运行时常量池条目必须是对方法类型或方法句柄的符号引用 (§5.1)。...

此引用有一个指向 JVM 规范 (5.1) 的另一部分的链接,该部分描述了运行时常量池:

一种运行时数据结构,用于传统编程语言实现的符号表的许多用途

这意味着运行时常量池以符号形式包含有关类的各个部分的信息:作为文本值。

因此,当给定对类的“符号引用”时,它被赋予常量池中结构的索引。如果您查看此结构的定义,您会发现它包含对类名称的引用,该类的名称也保存在常量池中。ldcCONSTANT_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

在这种情况下,操作是指以符号方式存储的类。当 JVM 执行此操作码时,它将使用符号引用来标识当前类装入器中的实际类,并返回对类实例的引用。ldc


答案 2

推荐