1

メソッド呼び出しの引数を表示したい。したがって、foo を呼び出すと、次のようになります。

x = 4;

y = 5;

...

foo(x, y, 20, 25);

引数 (4,5,20,25) を出力したい メソッドが呼び出される前に、これらの引数がスタックにプッシュされることを理解しています。メソッドのローカル変数配列から値 (初期化または定数の場合) を取得するにはどうすればよいですか?

visitVarInsn() と VarInsnNode には、配列から実際の値を検索する方法がありません。

これを行うには、Analyzer と Interpreter を使用する必要がありますか? または、より簡単な方法はありますか?

編集:これを行う方法を考え出しました。バイトコード命令の引数を考慮して BasicValue と BasicInterpreter を変更しました。したがって、BIPUSH などの命令を表す値には、型情報だけでなく、プッシュされる値に関する情報が含まれます。フレームはアナライザーと同じ方法で検査されます

4

2 に答える 2

1

メソッド呼び出しに直接渡される定数数値 (20 および 25) は、静的に取得するのが簡単です。それらは、visitIntInsn で読み取ることができるプッシュ命令になります。値が小さいと const 命令になり、visitInsn でキャッチできます。値が大きいと、visitLdcInsn でキャッチできます。

メソッド呼び出しの時点で変数にバインドされた値を静的に決定することが一般的に可能であるとは思いません。各変数の可能な値の範囲を提供できるはずのデータフロー分析(AnalyzerとInterpreterを使用)を行う必要があります。これは、一般的なケースでは明確な値を提供しませんが、変数が一度だけ割り当てられるか、複数回割り当てられる特定のケースでは、無条件に割り当てられます。

于 2013-07-24T20:05:07.360 に答える
0

asmやバイトコード操作とは関係ありませんが、念のため-

メソッドfooがインターフェイス メソッドfooを持つクラスに属している場合、 Proxyを使用してインターフェイスの実装をラップし、メソッド名をインターセプトできます。

また、この回答は ASM バイトコードの変更に役立つ場合があります。

于 2013-07-23T01:15:15.710 に答える