当前位置: 首页 > 面试题库 >

Java中的符号引用

古弘
2023-03-14
问题内容

这些天来,我一直在使用Java反射和.class格式。我目前正在学习ldc教学。

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

  1. 这是什么意思?

  2. 在哪里使用?

  3. ldc指令在哪些情况下加载符号引用?

  4. Java中是否有与该操作对应的代码?

问题答案:

如果您引用给您带来麻烦的文档的确切内容,将很有帮助。既然您还没有,我将猜测一下ldc的文档中您可能引用的内容:

否则,如果运行时常量池条目是对类的符号引用(第5.1节),则将解析命名的类(第5.4.3.3.1节),并将对表示该类值的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执行此操作码时,它将使用符号引用来标识当前类加载器中的实际类,并返回对类实例的引用。



 类似资料:
  • 问题内容: 这让我发疯了,所以请您帮忙… 我有一个Java字符串,我想用单引号替换所有反斜杠双引号序列,即使我逃避了我认为必要的替换命令,该命令也不会对字符串产生任何影响。 感谢任何建议。 谢谢。 问题答案: 在Java中,字符串是不可变的。您对字符串执行的任何操作都会产生新的对象。操作后,您需要重新分配值。以下内容可能会对您有所帮助。

  • 问题内容: 我知道可以在Java字符串中用双引号将符号放在双引号之前。但是,如果在字符串中经常使用双引号,那么是否有一种方法可以将字符串标记一次,因此不需要在每个双引号之前写上符号吗?(就像在C#中一样,可以将符号放在字符串之前)示例: 代替 问题答案: 你不能 但是,如果您懒得不能使用双引号,则可以使用一些技巧。例如: 输出:

  • 本文向大家介绍浅谈C语言中的强符号、弱符号、强引用和弱引用,包括了浅谈C语言中的强符号、弱符号、强引用和弱引用的使用技巧和注意事项,需要的朋友参考一下 首先我表示很悲剧,在看《程序员的自我修养--链接、装载与库》之前我竟不知道C有强符号、弱符号、强引用和弱引用。在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点。   首先我们看一下书中关于它

  • 本文向大家介绍PowerShell中字符串使用单引号和双引号的区别,包括了PowerShell中字符串使用单引号和双引号的区别的使用技巧和注意事项,需要的朋友参考一下 本文介绍PowerShell开发时,在字符串中如何去包含变量。将变量包含在字符串中,最后得到的结果是将变量的值放入到了字符串中。 假如有一个字符串变量:$p = "PowerShell" 那么 $str="Hello $p",这时,

  • 问题内容: 我有一个模糊的字符串,像这样: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。(编辑:我想我的意思是那些已经属于JDK或已经属于诸如Apache Commons之类的常用库的库。) 上面的字符串应分为: 注意:这不是CSV文件,它是文件中包含的单个字符串,具有较大的整体

  • 问题内容: 我有这样一个字符串: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。 上面的字符串应分为: 问题答案: 可以使用正则表达式 输出: