2013-07-23 29 views
1

我想查看方法调用的参数。所以,如果我调用foo:方法调用访问变量/常量值

x = 4; 

y = 5; 

... 

foo(x, y, 20, 25); 

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

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

我需要使用分析器和解释器来做到这一点,还是有更简单的方法吗?

编辑:想通了如何做到这一点。 我修改了BasicValue和BasicInterpreter来说明字节码指令参数。 因此,表示像BIPUSH这样的指令的值包含有关正在推送的值的信息,而不仅仅是类型信息。 帧进行检查以同样的方式与分析

+0

你想解决什么问题? – Bohemian

+0

你想在编译时(不运行程序)或运行时静态地找到参数吗? (第二个beeing更容易) – ruediste

+0

我需要静态找到它们。我只需要知道它们是否被初始化,以及初始值 – zaz

回答

0

它不涉及到ASM和字节码操作,但以防万一 -

如果方法FOO属于与接口方法的类你可以使用Proxy来包装接口实现和拦截方法名称。

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

1

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

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