Java 使用ASM访问阵列
我想知道是否可以使用ASMAPI跟踪对阵列的访问 我的目标是确定访问数组的哪个索引以及何时访问(这一部分很简单-使用Java 使用ASM访问阵列,java,arrays,visitor,java-bytecode-asm,Java,Arrays,Visitor,Java Bytecode Asm,我想知道是否可以使用ASMAPI跟踪对阵列的访问 我的目标是确定访问数组的哪个索引以及何时访问(这一部分很简单-使用System.NanoTime())。我只是找不到一种方法来确定正在访问哪个索引 我一直在尝试使用以下内容,但没有成功-visitFieldInsn(对于类的静态和非静态变量),visitVarInsn(对于静态和非静态局部变量),和visitMultiANewArrayInsn——它实际上无法识别任何数组。特定索引不是指令的一部分。您必须查看操作数堆栈顶部的值,以找出指令引用的索
System.NanoTime()
)。我只是找不到一种方法来确定正在访问哪个索引
我一直在尝试使用以下内容,但没有成功-
visitFieldInsn
(对于类的静态和非静态变量),visitVarInsn
(对于静态和非静态局部变量),和visitMultiANewArrayInsn
——它实际上无法识别任何数组。特定索引不是指令的一部分。您必须查看操作数堆栈顶部的值,以找出指令引用的索引。看
但是,您不想破坏操作数堆栈,因此当遇到数组访问指令时,请执行DUP
复制堆栈顶部(复制指令引用的索引),然后打印值或对其执行任何操作,然后访问原始指令继续
但是,您应该知道,访问阵列有多个不同的指令:
,aaload
,iaload
,laload
,saload
,baload
和caload
用于读取,以及daload
,aastore
,iastore
,lastore
,sastore
,bastore
和castore
用于编写dastore
这将允许您在访问int[]时使用Java执行任何您希望它执行的操作。有没有更好的方法可以以相同的分辨率获得时间而不影响结果?好的,通过JNI获得时间的其他方法也需要相同的时间。谢谢,我将试一试。