Java中的符号引用
在这些日子里,我一直在玩Javareflection和.class
格式。 我正在学习ldc
教学。
在JVM规范中,我发现术语我不明白: 符号引用 ,我有以下问题。
-
这是什么意思?
-
在哪里使用?
-
ldc
指令在哪些情况下加载符号引用? - Java中是否有与该操作对应的代码?
如果您引用给您带来麻烦的文档的确切部分,将会很有帮助。 既然你没有,我将从ldc的doc中猜测你可能引用的内容 :
否则,如果运行时常量池条目是对类的符号引用(第5.1节),则解析命名类(第5.4.3.1节),并且对表示该类值的Class对象的引用将被推送到操作数堆栈。
否则,运行时常量池条目必须是对方法类型或方法句柄的符号引用(第5.1节)。 …
该引用有一个指向JVM规范(5.1)的另一部分的链接,该部分描述了运行时常量池:
运行时数据结构,其用于传统编程语言实现的符号表的许多目的
这意味着运行时常量池包含有关符号forms的类的各个部分的信息:作为文本值。
因此,当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执行此操作码时,它将使用符号引用来标识当前类加载器中的实际类,并返回对类实例的引用。