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

时间:2013-07-23 00:59:49

标签: java bytecode java-bytecode-asm

我想查看方法调用的参数。所以如果我打电话给foo:

x = 4;

y = 5;

...

foo(x, y, 20, 25);

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

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

我是否需要使用Analyzer和Interpreter来执行此操作,还是有更简单的方法?

编辑:想出如何做到这一点。 我修改了BasicValue和BasicInterpreter来解释字节码指令参数。 因此,表示像BIPUSH这样的指令的值包含有关被推送值的信息,而不仅仅包含类型信息。 使用Analyzer

以相同的方式检查帧

2 个答案:

答案 0 :(得分:1)

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

我不相信通常可以在方法调用的静态点确定绑定到变量的值。您需要进行数据流分析(使用您建议的Analyzer和Interpreter),这应该能够为每个变量提供可能的值范围。在一般情况下,这不会给出明确的值,但在特定的情况下,只会分配一次或分配多次,但无条件。

答案 1 :(得分:0)

它与asm和字节码操作无关,但仅限于 -

如果方法 foo 属于具有接口方法 foo 的类,则可以使用Proxy来包装接口实现和拦截方法名称。

此外,您可能会发现this答案对ASM字节码修改很有用。