我正在使用ASM来监视字段访问(putfield和getfield)。 (对于putfield,)我的问题是,当堆栈的顶部是基本值(X)而第二个顶部是对象引用(Y)时,如何插入一些Java指令以使用第二个对象引用调用我的方法( Y)作为它的一个参数,从我的方法返回后,两个(X和Y)不会丢失?
总之,如何在Java字节码级别上访问第二个顶级对象引用而不影响堆栈的最高值(在我访问之后)?
我想使用dup,但它只能处理堆栈的最高值。因此,它适用于getfield,因为没有值,我可以直接复制它。
有更好的方法吗?
感谢。
答案 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),允许你将它用于你选择的任何操作,例如:方法调用。完成该操作后,堆栈的状态与执行操作之前的状态完全相同。