Java ASM如何读取LOAD或STORE字节码的值

标签 java java-bytecode-asm

我正在使用 asm(这里是文档 http://asm.ow2.org/asm40/javadoc/user/ ),更具体地说,我正在尝试动态检测一些代码。 我的问题是我不知道如何以及是否能够通过提供 asm 的内容来读取检测代码的实际变量。 即我能够检索在检测代码中计算的相应存储的 LocalVariableNode,此时我想知道我正在存储的值(不仅仅是可以使用 LocalVariableNode 类中提供的方法轻松获取的类型,而且实际值(如果它是一个 boolean 值,我想得到 true 或 false))。 同样,当加载字节码指令发生时获取值也会很有趣。

希望我已经足够具体了,我检查了是否已经有人问过类似的问题,但似乎还没有。

提前致谢。 尼古拉斯

最佳答案

我之前做过类似的事情,有点忘记了细节,但我想我可以给你一些指导。

当然,就像 creichen 在他的回答中所说的那样,不可能获得与 LocalVariable 相关的确切值,但可以获取字节码的整个抽象语法树并了解可能的值是什么类型在程序的某个时刻分配给该 LocalVariable。

对于每个 LocalVariableNode 都分配有一个索引,因此在字节码中,该值不会与 LocalVariable 静态关联,因为 Java 允许其可变。因此,为了了解程序某个时刻与 LocalVariable 关联的值,您必须基本上模拟字节码 (JVM) 的堆栈执行,然后有一个表来跟踪每个 LocalVariable 的值分配。堆栈执行是通过模拟指令(Opcode),基本上是字节码。然后逐步建立一个树结构来存储抽象语法树。

我确实有一个代码,但是很难看,你可以看一下:https://github.com/davidlau325/BytecodeASTGenerator

关于Java ASM如何读取LOAD或STORE字节码的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20217408/

相关文章:

java - WakeLock 会导致手机重启吗?

java - 用于开发的 WildFly 和 NetBeans 设置

java - 如何在另一个生成字节码类中使用匿名类实例

java - 如何将 Opcodes 中 ASM 的 API 版本映射到 Java 版本?

java - 在同一项目中使用 ASM 和 Javassist 的注意事项

java - 从 Web 服务中的 sun-web.xml 获取上下文根

java - 当我尝试重新定义变量时,出现索引越界错误

java - 如果测试不显示代码部分 - spring mvc

java - 如何在注入(inject) JVM 之前验证 Java 字节码?

java - ASM 动态子类创建 - NoClassDefFoundError BeanInfo