在Java字节码中获取堆栈操作数的arrayref

时间:2011-01-12 16:20:26

标签: java bytecode

我使用ASM API进行Java字节码指令,我希望能够在每次访问任何数组时确定访问哪个数组(通过数组的名称)。

我有两个问题: - 让我们以iastore指令为例。 arrayref被置于操作数堆栈中的另外两个变量 - 值和索引。如何在不破坏堆栈的情况下获取arrayref(我不能在堆栈中复制两个以上的顶级变量)? 我想到了堆栈中的pop索引和值并将它们保存在某处然后获取arrayref并最终将索引和值推回到堆栈但我真的不知道如何执行此操作...

  • 我想从arrayref(一旦拥有它)获取数组的名称(用户声明该数组名称的名称)。

提前感谢。

1 个答案:

答案 0 :(得分:0)

dup2_x1, pop2, dup_x2你现在在堆栈的顶部有arrayref。但总的来说,使用局部变量更简单,JIT之后的最终结果应该没有区别。

正如其他人评论的那样,问题的第二部分没有多大意义。变量中不需要对象,您可以分配和使用数组,而无需将其存储到任何变量中。

但我怀疑你的目的是跟踪x[0]=1之类的访问并将其归因于x,这可以通过数据流分析来实现。你将跟踪aload以及这些值的使用位置,如果你的arrayref直接来自aload,你知道该数组来自一个变量。