使用ASM访问阵列访问

时间:2010-12-04 13:21:55

标签: java arrays visitor java-bytecode-asm

我想知道是否可以使用ASM API跟踪对数组的访问。

我的目标是确定访问数组的哪个索引,以及何时(这部分很容易 - 使用System.NanoTime())。我找不到确定访问哪个索引的方法。

我一直试图使用以下内容而没有任何成功 - visitFieldInsn(对于类的静态和非静态变量),visitVarInsn(对于静态和非静态局部变量)和{{1 - 它没有真正识别任何数组。

2 个答案:

答案 0 :(得分:2)

特定索引不是指令的一部分。您必须查看操作数堆栈顶部的值以找出指令所引用的索引。请参阅JVM reference

您不希望破坏操作数堆栈,因此当您遇到数组访问指令时,执行DUP复制堆栈顶部(复制指令所指的索引)然后打印值或用它做任何你喜欢的事情,然后继续访问原始说明。

然而,您应该知道有多种不同的指令可以访问数组:

  • aaloadialoadlaloadsaloadbaloadcaloaddaload用于阅读,
  • aastoreiastorelastoresastorebastorecastoredastore用于撰写

答案 1 :(得分:0)

值得注意的是,nanoTime()需要大约100倍的长度才能访问数组。这可能会严重扭曲结果。

您是否尝试过使用ASMifier查看代码?这应该显示您的代码触发了哪些事件。

BTW你可以用方法调用代替数组查找,例如

public static int arrayGet(int [] int.int index)

这将允许您在访问int []时将您想要的任何内容放入Java中。