Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ASM访问者检查堆栈?_Java_Assembly_Bytecode_Java Bytecode Asm - Fatal编程技术网

Java 如何使用ASM访问者检查堆栈?

Java 如何使用ASM访问者检查堆栈?,java,assembly,bytecode,java-bytecode-asm,Java,Assembly,Bytecode,Java Bytecode Asm,我试图使用Java字节码工程库来执行静态分析。在这种情况下,我想检查分配给字段的变量 我有一个MethodVisitor,它实现了visitFieldInsn方法。我特别在找putfield命令。这没问题。问题是,当我遇到putfield时,我希望能够访问将分配给该字段的变量。具体来说,我想访问有关变量类型的信息 目前,我只需要查看堆栈顶部的内容,但是如果有更通用的方法来检查它,那就更好了 有没有办法使用ASM检查堆栈上的变量 我不熟悉ASM,但我做了一些与EclipseJavaAST框架类似的

我试图使用Java字节码工程库来执行静态分析。在这种情况下,我想检查分配给字段的变量

我有一个MethodVisitor,它实现了visitFieldInsn方法。我特别在找putfield命令。这没问题。问题是,当我遇到putfield时,我希望能够访问将分配给该字段的变量。具体来说,我想访问有关变量类型的信息

目前,我只需要查看堆栈顶部的内容,但是如果有更通用的方法来检查它,那就更好了


有没有办法使用ASM检查堆栈上的变量

我不熟悉ASM,但我做了一些与EclipseJavaAST框架类似的事情。为了了解变量,我必须自己在AST访问者的适当visitX方法中跟踪变量声明。一旦我知道哪些AST节点对应于变量声明,就不难了。

首先,如果您可以假设字节码是有效的,那么分配给字段的值的类型应该与字段类型匹配,您可以使用ClassReader API提前读取字段类型

但是,如果需要跟踪给定指令指针的堆栈或变量插槽上的每个值的来源,可以将Analyzer API与Source解释器一起使用。基本上,它允许查找产生给定值的指令,并且您可以使用有关该指令的信息来推断类型,例如,如果它从与方法参数相对应的变量读取,或者如果值是从方法调用返回的,那么在这两种情况下,您都可以从方法描述符获取类型。也可以看到我以前的博客文章,上面有一个