java - 在方法调用中访问变量/常量值

标签 java bytecode java-bytecode-asm

我想查看方法调用的参数。因此,如果我调用 foo:

x = 4;

y = 5;

...

foo(x, y, 20, 25);

我想打印参数(4,5,20,25) 我知道这些参数在调用方法之前被插入堆栈。如何从方法的局部变量数组中获取值(如果已初始化或常量)?

visitVarInsn() 和 VarInsnNode 无法从数组中查找实际值。

我是否需要使用分析器和解释器来执行此操作,或者有更简单的方法吗?

编辑:弄清楚如何做到这一点。 我修改了 BasicValue 和 BasicInterpreter 以考虑字节码指令参数。 因此,表示像 BIPUSH 这样的指令的值包含有关被推送的值的信息,而不仅仅是类型信息。 使用分析器以相同的方式检查帧

最佳答案

直接传递给方法调用的常量数值(20 和 25)很容易静态检索 - 它们将产生推送指令,您可以在访问IntInsn 中读取这些指令。较小的值将导致 const 指令,您可以使用访问Insn捕获,较大的值可以使用visitLdcInsn捕获。

我认为通常不可能静态地确定方法调用时绑定(bind)到变量的值。您将需要进行数据流分析(按照您的建议使用分析器和解释器),它应该能够提供每个变量的可能值范围。在一般情况下,这不会给您确定的值,但在变量仅分配一次或分配多次但无条件的特定情况下,会给您确定的值。

关于java - 在方法调用中访问变量/常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799855/

相关文章:

eval - 在字节码编译语言中实现 REPL/eval

java - 基于 JVM 的语言/运行时如何生成 Java 字节码?

java - 如何重用asm中methodNode的原始帧信息来创建 `org.objectweb.asm.tree.analysis.Frame`

java - ASM 从堆栈帧中获取精确值

java - 我怎样才能让球在java中连续左右移动?

java - 替换Java中的静态引用方法

java - 字节码是否被视为 JVM 的指令集?

java - 使用asm如何声明非泛型类实现泛型接口(interface)

java - 创建名为 : Injection of autowired dependencies failed, 的 bean 时出错,无法解析占位符

java - token 语法错误,预期 ConstructorHeaderName 和 token 语法错误 "(",< 预期