2012-10-10 50 views
2

我正在使用ASM來監視字段訪問(putfield和getfield)。 (對於putfield,)我的問題是,當堆棧的頂部是一個基本值(X),第二個頂部是一個對象引用(Y)時,如何插入一些Java指令來調用我的方法與第二個對象引用Y)作爲一個參數,並從我的方法返回後,兩個(X和Y)不會丟失?訪問使用ASM的Java堆棧中的第二個頂層對象

總之,如何訪問第二個頂級對象引用而不影響堆棧的頂部值(在我訪問後)在Java字節碼級別的Java?

我想使用dup,但它只能處理堆棧的最高值。所以,它適用於getfield,因爲沒有價值,我可以直接複製它。

有沒有更好的方法來做到這一點?

謝謝。

回答

1

案例1 ...基本價值不長或雙 -

比方說,該堆棧的頂部看起來是這樣的......

Y,X(最右邊的元素作爲堆棧的頂部。)

指令應該做的伎倆下面的順序...

DUP2

POP

DUP2將複製前兩條指令。從而導致Y,X,Y,X。 POP將彈出X(基本值)。你會留下Y,X,Y。然後你可以調用你的函數。

案例2 ...的基本價值是一個長期或雙 - 疊

的頂部看起來像這樣... Y,X1,X2。爲此,您可以使用下面的指令序列...

DUP2_X1 //這將導致X1,X2,Y,X1,X2

POP2 //這將導致X1, X2,Y

DUP_X2 //這將導致Y,X1,X2,Y

因此再次,你有Y於堆棧的頂部。它下面的一切都和以前一樣。

在這兩種情況下,您最終得到的是堆棧頂部的Object Ref(Y),允許您將它用於您所選擇的任何操作,例如,方法調用。一旦該操作完成,堆棧的狀態就與您執行操作之前的狀態完全一樣。

+0

非常感謝。我想我的想法是從你的答案中訪問Stack中的第二個值,以獲得兩種類型的最高值。 –