2

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

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

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

有没有更好的方法来做到这一点?

谢谢。

4

1 回答 1

1

案例1...基本值不是Long或Double -

假设堆栈的顶部看起来像这样......

Y,X(最右边的元素是堆栈的顶部。)

以下指令序列应该可以解决问题...

DUP2

流行音乐

DUP2 将复制前两条指令。因此导致 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 回答