java - 使用ASM访问数组

标签 java arrays visitor-pattern java-bytecode-asm

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

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

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

最佳答案

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

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

但是您应该知道有多个不同的指令可以访问数组:

  • aaloadialoadlaloadsaloadbaloadcaloaddaload 用于读取,以及
  • aastoreiastorelastoresastorebastorecastoredastore 用于编写

关于java - 使用ASM访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353692/

相关文章:

java - Guava Cache 的概率提前过期

c++ - 将文件读入数组并输出数组 C++

design-patterns - 我需要询问对象类,但这是一种不好的做法。这种情况的替代方案?

c++ - CPP boost 访客多目标

c# - 接口(interface)实现中多个 if 语句的最佳设计模式

java - 小程序在页面刷新后或导航到同一页面后无法重新加载,第二次获取 classNotFoundException(页面刷新后)

java - 有没有一种简单的方法可以在 Guava 中循环标准输入?

java - 我如何让 TestNG 在特定组中运行测试(从命令行)?

c++ - 生成随机字母数组并计算出现次数

c - 使用 C 中的值初始化 char 数组会导致段错误