Java中的符号引用
这些天来,我一直在使用Java反射和.class
格式。我目前正在学习ldc
教学。
在JVM规范中,我发现了一个我不理解的术语: ,并且我有以下问题。
这是什么意思?
在哪里使用?
该
ldc
指令在哪些情况下加载符号引用?- Java中是否有与该操作对应的代码?
回答:
如果您引用给您带来麻烦的文档的确切内容,将很有帮助。既然您还没有,我将猜测一下ldc的文档中您可能引用的内容:
否则,如果运行时常量池条目是对类的符号引用(第5.1节),则将解析命名的类(第5.4.3.3.1节),并将对表示该类值的Class对象的引用压入操作数堆栈。
否则,运行时常量池条目必须是对方法类型或方法句柄的符号引用(第5.1节)。…
此引用具有指向JVM规范(5.1)的另一部分的链接,该部分描述了运行时常量池:
一种运行时数据结构,可满足常规编程语言实现的符号表的许多目的
这意味着运行时常量池以符号形式包含有关类片段的信息:作为文本值。
因此,当ldc
给一个类的“符号引用”时,它就给定CONSTANT_Class_info
了常量池中结构的索引。如果查看此结构的定义,您会发现它包含对类名的引用,该类名也保存在常量池中。
“符号引用”是可用于检索实际对象的字符串。
一个例子:
if (obj.getClass() == String.class) { // do something
}
变为以下字节码:
aload_1invokevirtual #21; //Method java/lang/Object.getClass:()Ljava/lang/Class;
ldc #25; //class java/lang/String
if_acmpne 20
在这种情况下,该ldc
操作引用的是符号存储的类。JVM执行此操作码时,它将使用符号引用来标识当前类加载器中的实际类,并返回对类实例的引用。
以上是 Java中的符号引用 的全部内容, 来源链接: utcz.com/qa/427666.html