java - 使用 ASM4 重新映射标签

标签 java local-variables java-bytecode-asm bytecode-manipulation

我正在使用ASM4用于一些 Java 字节码操作。我想将一些代码从一种方法复制到另一种方法。后者有一些额外的代码,因此第一个方法中的每个 LabelNode 都必须重新映射。

当需要插入局部变量时就会出现问题。我遵循这种模式:从第一个方法获取局部变量,创建它的副本,并修改索引和开始标签和结束标签节点。用于获取局部变量的访问者具有以下形式:

public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index)

插入新局部变量的代码如下所示:

localVariableList.add(new LocalVariableNode((String name, String desc, String signature, LabelNode start, LabelNode end, int index)))

问题是,Label对象的info字段为空,因此我无法获取旧LabelNode的引用,因此我可以使用新的标签节点重新映射。

我还尝试使用 label.getOffset() 从代码中获取偏移量,然后将偏移量重新映射到与我的新 LabelNode 列表关联的偏移量列表但我遇到了一个异常(exception):

java.lang.IllegalStateException: Label offset position has not been resolved yet
at org.objectweb.asm.Label.getOffset(Unknown Source)

如果你们中的任何人知道如何从 Label 获取相应的 LabelNode 将不胜感激。 或者也许有更好的方法将代码从一种方法复制到另一种方法并解决标签、标签节点和局部变量的问题。

大多数时候我使用树 API,因为它很简单。

感谢您的帮助。

最佳答案

我的 AOSD'07 paper 的“内联方法”部分有一个类似转换的示例.

关于java - 使用 ASM4 重新映射标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16963702/

相关文章:

java - 从 Java 列表中获取对象

java - 替换链表中的方法有一些错误

java - 如何在反序列化 Pojo 时忽略 JSON 根元素

java - 如何调试内部错误?

java - 如何通过ASM捕获字节码中的运行时异常

java - 如何避免验证错误: “Expecting to find unitialized object on stack” for objects already initialized

带有 Jersey 和 ActiveMQ 的 Java RESTful 服务 - 在启动时加载到 ActiveMQ 的连接

c++ - 局部变量赋值导致Audio在JUCE中停止处理

clojure - 函数局部、自引用、惰性斐波那契数列

c++ - 如何使用指针从不同的函数访问局部变量?