【问题标题】:Visit the second top Object in Java Stack using ASM使用 ASM 访问 Java Stack 中的第二个顶级对象
【发布时间】:2012-10-11 11:33:15
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: java java-bytecode-asm


    【解决方案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),允许您将它用于您选择的任何操作,例如一个方法调用。一旦该操作完成,堆栈的状态与您执行操作之前的状态完全相同。

    【讨论】:

    • 非常感谢。我想我的想法是从您的答案中访问 Stack 中的第二个值,对于两种类型的最高值。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2015-11-24
    • 2020-03-23
    • 2021-02-27
    • 2017-05-13
    相关资源
    最近更新 更多