我正在使用asm(在这里是文档http://asm.ow2.org/asm40/javadoc/user/),更具体地说,我正在尝试动态检测一些代码。
我的问题是,我不知道如何以及是否能够通过提供asm的方式读取已检测代码的实际变量。
即我能够检索我在检测代码中计算出的相应存储的LocalVariableNode,这时我想知道我存储的值(不仅是可以使用LocalVariableNode类提供的方法轻松实现的类型,而且实际值(如果是布尔值,我想得出true或false)。
同样,在发生加载字节码指令时获取该值将很有趣。
希望我已经足够具体了,我检查是否已经询问过类似的问题,但似乎没有。
提前致谢。
尼古拉斯
最佳答案
之前我做了类似的事情,有点忘记细节,但是我想我可以给你一些指导。
当然,就像creichen在他的回答中说的那样,不可能获得与LocalVariable相关的确切值,但是有可能获得整个字节码的抽象语法树,并知道将为它分配什么样的可能值。在程序的某个位置可以使用LocalVariable。
为每个LocalVariableNode分配了一个索引,因此在字节码中,该值不会与LocalVariable静态关联,因为Java允许对此进行可变。因此,为了知道在程序的某个位置与LocalVariable关联的值,您必须基本模拟字节码(JVM)的堆栈执行,然后有一个表来跟踪每个LocalVariable的值分配。堆栈执行是通过模拟指令(Opcode),基本上是字节码。然后逐渐建立一个Tree结构来存储抽象语法树。
我确实有一个代码,但是非常难看,您可以看一下:https://github.com/davidlau325/BytecodeASTGenerator
关于java - Java ASM如何读取LOAD或STORE字节码的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20217408/