Java中的符号引用

use*_*443 13 java reference constants symbolic-references

在这些日子里,我一直在玩Java反射和.class格式.我正在学习ldc指导.

在JVM规范中我发现术语我不明白:符号引用,我有以下问题.

  1. 这是什么意思?

  2. 在哪里使用?

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

par*_*fal 17

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

否则,如果运行时常量池条目是对类的符号引用(第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
}
Run Code Online (Sandbox Code Playgroud)

成为以下字节码:

aload_1
invokevirtual   #21; //Method java/lang/Object.getClass:()Ljava/lang/Class;
ldc     #25; //class java/lang/String
if_acmpne       20
Run Code Online (Sandbox Code Playgroud)

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