使用ASM4重新映射标签

时间:2013-06-06 13:43:31

标签: 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)))

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

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

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

如果您有任何想法我如何从LabelNode获得相应的Label,我们将不胜感激。 或者可能有更好的方法将代码从一种方法复制到另一种方法并解决标签,lablenode和localvariables的问题。

大部分时间我都使用树API,因为它很简单。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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