我正在使用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/