【发布时间】:2013-03-19 16:08:59
【问题描述】:
对于使用 ASM 手动编写的 Java 字节码指令序列,有没有办法访问堆栈的状态?例如,对于如下组合:
ILOAD_0,ILOAD_1,IADD,DUP -> 1,1
这里的动机是编写测试代码来验证给定的一组指令是否导致给定的堆栈,例如
assert getCurrentStackLength() == 2
或
assert getTopElement() == (int) 1
等等。
【问题讨论】:
-
您是在专门询问 Java 字节码,对吗?
-
是的。 JVM 指令或 Java 字节码。
-
所以你很想执行它?您最好的选择可能是在生成的类中的方法中生成它们,附加代码以输出堆栈的状态并运行它。然后得到结果并断言你想要断言的任何东西。
-
@JoachimSauer,我如何“输出堆栈的状态”?
-
@shail619:这是棘手的部分;-) 我从未尝试过,我认为验证和类型检查可能会使这变得困难(或不可能?)。但除了这种方法,我想不出一个纯 Java 解决这个问题(除非你想重新实现 JVM,这会带来自己的一系列问题)。