在这些日子里,我一直在玩Java反射和.class
格式。我正在学习ldc
指令。
在JVM规范中,我发现术语我不明白:符号引用,我有以下问题。
这是什么意思?
它在哪里使用?
ldc
指令在哪些情况下会加载符号引用?答案 0 :(得分:17)
如果您引用给您带来麻烦的文档的确切部分,将会很有帮助。既然你没有,我会从ldc的文档中猜出你可能引用的内容:
否则,如果运行时常量池条目是符号引用 到一个类(第5.1节),然后解析命名类(§5.4.3.1)和a 引用表示该类的值的对象,值为 推到操作数堆栈上。
否则,运行时常量池条目必须是符号 引用方法类型或方法句柄(第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执行此操作码时,它将使用符号引用来标识当前类加载器中的实际类,并返回对类实例的引用。