Java字节码 - 替换深堆栈值的有效方式

时间:2014-04-13 06:11:23

标签: java stack bytecode

以下是问题的简短版本:是否有一种有效的方法,使用字节码操作来替换JVM堆栈上的深层值?为了帮助可视化,理想的解决方案在伪代码中看起来像这样:stack[offset] = new_value

查看Jasmin指令列表,似乎是替换值的唯一方法" deep"在堆栈上(实际上,只有大约4个以上的堆栈槽)如下:

  • 分配一个集合(例如数组或列表)
  • 将每个堆栈值存储到集合中,从进程中的堆栈中消耗每个值
  • 重复,直到要替换的值位于堆栈顶部
  • 弹出要替换的值
  • 推送新值
  • 将集合中的值推回堆栈(当然,顺序正确)

是否有更有效的方式?

请注意,假设使用局部变量太危险,因为此处的代码必须使用未知类的未知方法,无论其局部变量定义如何,并且没有前提条件它可以更改方法的局部变量定义,或类的字段。

2 个答案:

答案 0 :(得分:0)

不,没有简单的方法可以做到这一点。操作数堆栈设计为堆栈。

如果你能解释一下你究竟想做什么,也许我可以建议一个更好的方法去做。

答案 1 :(得分:0)

使用LocalVariablesSorter中的ASM bytecode manipulation framework,您可以自由地引入新的局部变量,并透明地重新映射现有变量。 ASM User Guide中有一些示例。