2011-01-12 68 views
4

我使用ASM API进行Java字节码instrumantation,我希望能够确定在每次访问任何数组时访问哪个数组(每个数组的名称)。在Java字节码中获取堆栈操作数的arrayref

我有两个问题: - 让我们以iastore指示为例。 arrayref放在操作数堆栈下的两个其他变量 - 值和索引。我如何得到arrayref而不损坏堆栈(我不能在堆栈中复制两个以上的顶层变量)? 我想从栈中弹出指数和价值,并将其保存的地方,然后得到数组引用,并最终推动指数和值回到堆栈,但我真的不知道如何做到这一点?

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

在此先感谢。

+1

你是什么意思的“阵列的名称”? – 2011-01-12 19:22:28

+0

您可以从类文件中获取变量名称。然而,许多变量(本地和成员)可以指向相同的数组对象,所以你想要哪个变量名? – Anon 2011-01-12 19:49:43

回答

0

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

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

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