1

Javaバイトコード操作にASM4を使用しています。あるメソッドから別のメソッドにコードをコピーしたい。後者には追加のコードがいくつかあるため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が null であるため、古いラベルの参照を取得できないため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、およびローカル変数の問題を解決するためのより良いアプローチがあるかもしれません。

ほとんどの場合、単純であるためツリー API を使用します。

助けてくれてありがとう。

4

1 に答える 1

2

私のAOSD'07 論文の「インライン メソッド」セクションに、同様の変換の例があります。

于 2013-06-07T13:35:32.650 に答える