【问题标题】:Symbolic references in JavaJava中的符号引用
【发布时间】:2013-06-28 16:10:19
【问题描述】:

这几天我一直在玩 Java 反射和.class 格式。我目前正在学习ldc 指令。

在 JVM 规范中我发现了我不理解的术语:符号引用,我有以下问题。

  1. 什么意思?

  2. 用在什么地方?

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

【问题讨论】:

    标签: java reference constants symbolic-references


    【解决方案1】:

    如果您能准确引用给您带来麻烦的文档部分,将会很有帮助。既然你还没有,我将从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
    

    在这种情况下,ldc 操作指的是一个以符号方式存储的类。当 JVM 执行这个操作码时,它会使用符号引用来识别当前类加载器中的实际类,并返回对类实例的引用。

    【讨论】:

    • 什么时候使用?什么时候需要这样的东西?
    • @user35443 - 出于同样的原因,您使用带名称的变量而不是显式内存地址编写代码。
    • 您是否有一些 Java 代码示例,其中 ldc 指令与符号链接一起使用?我无法想象必须使用它的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2014-10-17
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多