gpt4 book ai didi

java - 是否有类似的 VisitLdcInsn 用于加载对象(不是常量)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:37 25 4
gpt4 key购买 nike

我们用 Java 编写了一个简单的 PostScript 解释器,并希望通过直接为源代码的特定部分生成字节码来优化它。为此,我们需要从 Java 字节码上下文的上下文中加载对象。在生成的字节码方法的签名中指定此类对象并不好,因为在我们的例子中它们的数量可能很大。

在 Java Asm 中我们有方法

public void visitLdcInsn(Object cst)

它访问 LDC 指令。参数cst - 要加载到堆栈上的常量。

有什么方法可以加载非常量对象吗?

谢谢

最佳答案

自 Java 11 起,可以使用 LDC 指令加载任意常量。这些可能是任意类型的对象,但意味着具有恒定的语义,因此它们最好是不可变的。

为此,引用的常量池条目必须是 CONSTANT_Dynamic_info ,其结构与 CONSTANT_InvokeDynamic_info 类似,同样描述了引导方法。

一个区别是动态信息结构的name_and_type_index条目将指向一个字段描述符。此外,引导方法具有 (MethodHandles.Lookup,String,Class[,static argument]) 签名,该签名具有表示常量预期类型的​​ Class 参数,而不是 MethodType 对象。 bootstrap 方法必须直接返回常量值而不是调用站点。

invokedynamic 指令的共同点是,第一个引导过程的结果将与 LDC 指令关联,并在所有后续执行中使用(因为它应该是一个常量)。

这些动态常量的一个有趣的属性是,它们是另一个动态常量或 invokedynamic 指令的引导方法的有效静态参数(只要动态常量之间不存在循环依赖)。

请注意,已经有一个 convenience class包含一些现成的动态常量引导方法。

关于java - 是否有类似的 VisitLdcInsn 用于加载对象(不是常量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com