Java 中的符号引用
2022-09-04 02:02:05
在这些日子里,我一直在玩Java反射和格式。我目前正在学习教学。.class
ldc
在JVM规范中,我发现了我不理解的术语:符号引用,我有以下问题。
这是什么意思?
它在哪里使用?
- 在哪些情况下,指令加载符号引用?
ldc
- Java中是否有任何与该操作相对应的代码?
在这些日子里,我一直在玩Java反射和格式。我目前正在学习教学。.class
ldc
在JVM规范中,我发现了我不理解的术语:符号引用,我有以下问题。
这是什么意思?
它在哪里使用?
ldc
如果您引用给您带来麻烦的文档的确切部分,那将很有帮助。既然你没有,我将猜测你可能从ldc的文档中引用的内容:
否则,如果运行时常量池条目是对类 (§5.1) 的符号引用,则将解析命名类 (§5.4.3.1),并将对表示该类 value 的 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
在这种情况下,操作是指以符号方式存储的类。当 JVM 执行此操作码时,它将使用符号引用来标识当前类装入器中的实际类,并返回对类实例的引用。ldc