Java 访问方法调用中的变量/常量值
我想查看方法调用的参数。所以如果我打电话给foo:Java 访问方法调用中的变量/常量值,java,bytecode,java-bytecode-asm,Java,Bytecode,Java Bytecode Asm,我想查看方法调用的参数。所以如果我打电话给foo: x = 4; y = 5; ... foo(x, y, 20, 25); 我想打印参数(4,5,20,25) 我知道这些参数是在调用方法之前被推到堆栈上的。如何从方法的局部变量数组中获取值(如果已初始化或为常量) visitVarInsn()和VarInsnNode无法从数组中查找实际值 我需要使用分析器和解释器来完成这项工作,还是有更简单的方法 编辑:找到了如何做到这一点。 我修改了BasicValue和BasicInterprete
x = 4;
y = 5;
...
foo(x, y, 20, 25);
我想打印参数(4,5,20,25)
我知道这些参数是在调用方法之前被推到堆栈上的。如何从方法的局部变量数组中获取值(如果已初始化或为常量)
visitVarInsn()和VarInsnNode无法从数组中查找实际值
我需要使用分析器和解释器来完成这项工作,还是有更简单的方法
编辑:找到了如何做到这一点。
我修改了BasicValue和BasicInterpreter来解释字节码指令参数。
因此,表示BIPUSH等指令的值包含有关被推送的值的信息,而不仅仅是类型信息。
使用分析器以相同的方式检查帧这与asm和字节码操作无关,只是以防万一- 如果方法foo属于具有接口方法foo的类,则可以使用它包装接口实现并截取方法名称
此外,您可能会发现这个答案对ASM字节码修改很有用。它与ASM和字节码操作无关,只是以防万一- 如果方法foo属于具有接口方法foo的类,则可以使用它包装接口实现并截取方法名称
另外,您可能会发现这个答案对于ASM字节码修改很有用。直接传递给方法调用(20和25)的常量数值很容易静态检索-它们将生成可以在VisitInSN中读取的推送指令。较小的值将产生可通过visitInsn捕获的常量指令,较大的值可通过visitLdcInsn捕获
我认为通常不可能在方法调用点静态地确定绑定到变量的值。您将需要进行数据流分析(按照您的建议使用分析器和解释器),该分析应能够为每个变量提供可能的值范围。在一般情况下,这不会为您提供确定的值,但在仅指定一次或多次但无条件指定的变量的特定情况下,这将提供确定的值。直接传递给方法调用的常量数值(20和25)易于静态检索-它们将生成推送指令,您可以在visitIntInsn中读取这些指令。较小的值将产生可通过visitInsn捕获的常量指令,较大的值可通过visitLdcInsn捕获
我认为通常不可能在方法调用点静态地确定绑定到变量的值。您将需要进行数据流分析(按照您的建议使用分析器和解释器),该分析应能够为每个变量提供可能的值范围。在一般情况下,这不会为您提供确定的值,但在只指定一次或多次但无条件指定的变量的特定情况下会提供确定的值。您试图解决什么问题?您希望在编译时(不运行程序)还是在运行时静态地查找参数?(第二个更容易)我需要静态地找到它们。我只需要知道它们是否已初始化,以及初始值您试图解决的问题是什么?您想在编译时(不运行程序)或运行时静态地找出参数吗?(第二个更容易)我需要静态地找到它们。我只需要知道它们是否初始化,以及初始值