我想知道是否可以使用 ASM API 跟踪对数组的访问。
我的目标是确定访问数组的哪个索引以及何时访问(这部分很简单 - 使用 System.NanoTime() )。我只是找不到一种方法来确定正在访问哪个索引。
我一直在尝试使用以下内容,但没有成功 - visitFieldInsn
(对于类的静态和非静态变量),visitVarInsn
(对于静态和非静态局部变量),以及 visitMultiANewArrayInsn
- 它并没有真正识别任何数组。
最佳答案
特定索引不是指令的一部分。您必须查看操作数堆栈顶部的值才能找出指令引用的索引。请参阅JVM reference .
但是,您不想破坏操作数堆栈,因此当您遇到数组访问指令时,请执行 DUP
复制堆栈顶部(复制指令引用的索引) ),然后打印该值或对其执行任何您喜欢的操作,然后继续访问原始指令。
但是您应该知道有多个不同的指令可以访问数组:
aaload
、iaload
、laload
、saload
、baload
、caload
和daload
用于读取,以及aastore
、iastore
、lastore
、sastore
、bastore
、castore
和dastore
用于编写
关于java - 使用ASM访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353692/