繁体   English   中英

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

[英]Visit the second top Object in Java Stack using ASM

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

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

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

有更好的方法吗?

谢谢。

情况1 ...基本值不是Long或Double-

可以说栈顶看起来像这样...

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

以下说明序列应该可以解决问题...

DUP2

POP

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。 下方的所有内容均与以前相同。

在这两种情况下,最终得到的都是堆栈顶部的对象引用(Y),使您可以将其用于您选择的任何操作,例如方法调用。 该操作完成后,堆栈的状态将与执行操作之前的状态完全相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM