我正在使用asm4进行一些java字节码操作。我想把一些代码从一个方法复制到另一个方法。后者有一些额外的代码,因此每个 LabelNode
从第一个方法开始必须重新Map。
当需要插入局部变量时,问题就出现了。我遵循这个模式:从第一个方法获取局部变量,创建一个副本,修改索引和开始标签以及结束标签节点。用于获取局部变量的访问者具有以下形式:
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
这样我就可以重新Map我的新标签节点。
我还试着用 label.getOffset()
然后将偏移量重新Map到与我的新偏移量列表关联的偏移量列表 LabelNode
但我有个例外:
java.lang.IllegalStateException: Label offset position has not been resolved yet
at org.objectweb.asm.Label.getOffset(Unknown Source)
如果你们中有人知道我如何得到相应的 LabelNode
从 Label
非常感谢。或者有更好的方法将代码从一个方法复制到另一个方法,并用标签、标签节点和localvariables解决问题。
大多数时候我使用treeapi是因为它很简单。
谢谢你的帮助。
1条答案
按热度按时间6yt4nkrj1#
在我的aosd'07论文的“内联方法”一节中有一个类似转换的例子。