问题 Java中的符号引用


在这些日子里,我一直在玩Java反射和 .class 格式。我正在读书 ldc 指令。

在JVM规范中我发现术语我不明白: 象征性的参考,我有以下问题。

  1. 这是什么意思?

  2. 在哪里使用?

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

6035
2017-07-01 13:53


起源



答案:


如果您引用给您带来麻烦的文档的确切部分,将会很有帮助。既然你没有,我会猜测你可能引用的内容,来自doc 最不发达国家

否则,如果运行时常量池条目是符号引用   到一个类(第5.1节),然后解析命名类(§5.4.3.1)和a   对表示该类的值的Class对象的引用是   推到操作数堆栈上。

否则,运行时常量池条目必须是符号   引用方法类型或方法句柄(第5.1节)。 ...

该引用有一个指向JVM规范(5.1)的另一部分的链接,该部分描述了运行时常量池:

一个运行时数据结构,它有许多用途   传统编程语言实现的符号表

这意味着运行时常量池包含有关符号形式的类的各个部分的信息:作为文本值。

所以,何时 ldc 被给予一个类的“符号引用”,它给出了a的索引 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 operation是指以符号方式存储的类。当JVM执行此操作码时,它将使用符号引用来标识当前类加载器中的实际类,并返回对类实例的引用。


16
2017-07-01 14:13



什么时候使用?什么时候需要这样的东西? - user35443
@ user35443 - 出于同样的原因,您使用带有名称的变量而不是显式内存地址来编写代码。 - parsifal
你有一些Java代码示例吗? ldc 指令与符号链接一起使用?我无法想象这必须使用的情况。 - user35443
现在我理解了,非常感谢!!! - user35443


答案:


如果您引用给您带来麻烦的文档的确切部分,将会很有帮助。既然你没有,我会猜测你可能引用的内容,来自doc 最不发达国家

否则,如果运行时常量池条目是符号引用   到一个类(第5.1节),然后解析命名类(§5.4.3.1)和a   对表示该类的值的Class对象的引用是   推到操作数堆栈上。

否则,运行时常量池条目必须是符号   引用方法类型或方法句柄(第5.1节)。 ...

该引用有一个指向JVM规范(5.1)的另一部分的链接,该部分描述了运行时常量池:

一个运行时数据结构,它有许多用途   传统编程语言实现的符号表

这意味着运行时常量池包含有关符号形式的类的各个部分的信息:作为文本值。

所以,何时 ldc 被给予一个类的“符号引用”,它给出了a的索引 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 operation是指以符号方式存储的类。当JVM执行此操作码时,它将使用符号引用来标识当前类加载器中的实际类,并返回对类实例的引用。


16
2017-07-01 14:13



什么时候使用?什么时候需要这样的东西? - user35443
@ user35443 - 出于同样的原因,您使用带有名称的变量而不是显式内存地址来编写代码。 - parsifal
你有一些Java代码示例吗? ldc 指令与符号链接一起使用?我无法想象这必须使用的情况。 - user35443
现在我理解了,非常感谢!!! - user35443