1

我正在使用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从 a获得相应的信息,Label将不胜感激。或者也许有更好的方法可以将代码从一种方法复制到另一种方法,并使用标签、标签节点和局部变量来解决问题。

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

谢谢你的帮助。

4

1 回答 1

2

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

于 2013-06-07T13:35:32.650 回答