我想知道是否可以使用ASM API跟踪对数组的访问。
我的目标是确定访问数组的哪个索引,以及何时(这部分很容易 - 使用System.NanoTime()
)。我找不到确定访问哪个索引的方法。
我一直试图使用以下内容而没有任何成功 - visitFieldInsn
(对于类的静态和非静态变量),visitVarInsn
(对于静态和非静态局部变量)和{{1 - 它没有真正识别任何数组。
答案 0 :(得分:2)
特定索引不是指令的一部分。您必须查看操作数堆栈顶部的值以找出指令所引用的索引。请参阅JVM reference。
您不希望破坏操作数堆栈,因此当您遇到数组访问指令时,执行DUP
复制堆栈顶部(复制指令所指的索引)然后打印值或用它做任何你喜欢的事情,然后继续访问原始说明。
然而,您应该知道有多种不同的指令可以访问数组:
aaload
,iaload
,laload
,saload
,baload
,caload
和daload
用于阅读,aastore
,iastore
,lastore
,sastore
,bastore
,castore
和dastore
用于撰写答案 1 :(得分:0)
值得注意的是,nanoTime()需要大约100倍的长度才能访问数组。这可能会严重扭曲结果。
您是否尝试过使用ASMifier查看代码?这应该显示您的代码触发了哪些事件。
BTW你可以用方法调用代替数组查找,例如
public static int arrayGet(int [] int.int index)
这将允许您在访问int []时将您想要的任何内容放入Java中。