2

ASMを使用してフィールドアクセス(putfieldとgetfield)を監視しています。(putfieldの場合)私の問題は、スタックの最上位が基本値(X)で、2番目の最上位がオブジェクト参照(Y)である場合、2番目のオブジェクト参照を使用してメソッドを呼び出すJava命令を挿入するにはどうすればよいですか( Y)その1つの引数として、私のメソッドから戻った後、2つ(XとY)は失われませんか?</ p>

要約すると、JavaバイトコードレベルでJavaのスタックの最上位値に影響を与えることなく(アクセス後)、2番目の最上位オブジェクト参照にアクセスするにはどうすればよいですか?

dupを使用したいのですが、スタックの最上位値しか処理できません。したがって、値がなく、直接複製できるため、getfieldで機能します。

それを行うためのより良い方法はありますか?

ありがとう。

4

1 に答える 1

1

ケース 1... 基本値が Long でも Double でもない -

スタックの上部が次のようになっているとしましょう...

Y,X (一番右の要素がスタックの最上部です。)

次の一連の手順でうまくいくはずです...

DUP2

ポップ

DUP2 は、上位 2 つの命令を複製します。したがって、Y、X、Y、X になります。POP は X (基本値) をオフにポップします。そして、Y、X、Y が残ります。そして、関数を呼び出すことができます。

ケース 2... 基本値は Long または Double -

スタックの最上部は次のようになります... Y、X1、X2。これには、次の一連の手順を使用できます...

DUP2_X1 // これは X1,X2,Y,X1,X2 になります

POP2 // これは X1、X2、Y になります

DUP_X2 // これは Y,X1,X2,Y になります

したがって、スタックの一番上に Y があります。そして、その下にあるものはすべて以前と同じです。

どちらの場合も、最終的に得られるのはスタックの一番上にある Object Ref (Y) であり、メソッド呼び出しなど、任意の操作に使用できます。その操作が完了すると、スタックの状態は、操作を実行する前とまったく同じになります。

于 2012-10-11T03:26:20.693 に答える