Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ASM访问阵列_Java_Arrays_Visitor_Java Bytecode Asm - Fatal编程技术网

Java 使用ASM访问阵列

Java 使用ASM访问阵列,java,arrays,visitor,java-bytecode-asm,Java,Arrays,Visitor,Java Bytecode Asm,我想知道是否可以使用ASMAPI跟踪对阵列的访问 我的目标是确定访问数组的哪个索引以及何时访问(这一部分很简单-使用System.NanoTime())。我只是找不到一种方法来确定正在访问哪个索引 我一直在尝试使用以下内容,但没有成功-visitFieldInsn(对于类的静态和非静态变量),visitVarInsn(对于静态和非静态局部变量),和visitMultiANewArrayInsn——它实际上无法识别任何数组。特定索引不是指令的一部分。您必须查看操作数堆栈顶部的值,以找出指令引用的索

我想知道是否可以使用ASMAPI跟踪对阵列的访问

我的目标是确定访问数组的哪个索引以及何时访问(这一部分很简单-使用
System.NanoTime()
)。我只是找不到一种方法来确定正在访问哪个索引


我一直在尝试使用以下内容,但没有成功-
visitFieldInsn
(对于类的静态和非静态变量),
visitVarInsn
(对于静态和非静态局部变量),和
visitMultiANewArrayInsn
——它实际上无法识别任何数组。

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

但是,您不想破坏操作数堆栈,因此当遇到数组访问指令时,请执行
DUP
复制堆栈顶部(复制指令引用的索引),然后打印值或对其执行任何操作,然后访问原始指令继续

但是,您应该知道,访问阵列有多个不同的指令:

  • aaload
    iaload
    laload
    saload
    baload
    caload
    daload
    用于读取,以及
  • aastore
    iastore
    lastore
    sastore
    bastore
    castore
    dastore
    用于编写

值得注意的是,nanoTime()需要大约100倍于阵列自身访问的时间。这可能会严重扭曲结果

你试过用asmizer查看你的代码吗。这将向您显示由您的代码触发的事件

顺便说一句,您可以用方法调用替换数组查找,例如

公共静态int数组集(int[]int.int索引)


这将允许您在访问int[]时使用Java执行任何您希望它执行的操作。

有没有更好的方法可以以相同的分辨率获得时间而不影响结果?好的,通过JNI获得时间的其他方法也需要相同的时间。谢谢,我将试一试。