使用ASM访问Java堆栈中的第二个顶级对象

时间:2012-10-10 13:16:58

标签: java java-bytecode-asm

我正在使用ASM来监视字段访问(putfield和getfield)。 (对于putfield,)我的问题是,当堆栈的顶部是基本值(X)而第二个顶部是对象引用(Y)时,如何插入一些Java指令以使用第二个对象引用调用我的方法( Y)作为它的一个参数,从我的方法返回后,两个(X和Y)不会丢失?

总之,如何在Java字节码级别上访问第二个顶级对象引用而不影响堆栈的最高值(在我访问之后)?

我想使用dup,但它只能处理堆栈的最高值。因此,它适用于getfield,因为没有值,我可以直接复制它。

有更好的方法吗?

感谢。

1 个答案:

答案 0 :(得分: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),允许你将它用于你选择的任何操作,例如:方法调用。完成该操作后,堆栈的状态与执行操作之前的状态完全相同。