Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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_Java Bytecode Asm - Fatal编程技术网

Java 使用asm检查字节码的代码示例

Java 使用asm检查字节码的代码示例,java,java-bytecode-asm,Java,Java Bytecode Asm,假设一个java类没有可用的源代码,我们只有.class文件。该类实现了JDK的Compariable接口。我想通过编程知道哪些字段/getter compareTo方法访问 使用asmbytecodelibrary,我想获得在某个方法中调用的所有getter或字段访问的列表。是否有可用的代码示例?对于ASM,您必须使用自定义的MethodVisior,它将在方法字节码内的每个方法调用中调用。您必须从自定义的ClassVisitor创建此访问者,该访问者只返回compareTo方法的此方法访问者

假设一个java类没有可用的源代码,我们只有.class文件。该类实现了JDK的
Compariable
接口。我想通过编程知道哪些字段/getter
compareTo
方法访问


使用
asm
bytecodelibrary,我想获得在某个方法中调用的所有getter或字段访问的列表。是否有可用的代码示例?

对于ASM,您必须使用自定义的
MethodVisior
,它将在方法字节码内的每个方法调用中调用。您必须从自定义的
ClassVisitor
创建此访问者,该访问者只返回
compareTo
方法的此方法访问者

new ClassReader(Foo.class.getName()).accept(new ClassVisitor() {
  @Override
  public MethodVisitor visitMethod(int access, String name, String desc, 
      String signature, String[] exceptions) {
    if(name.equals("compareTo") { // We found a method named 'compareTo'
      return new MethodVisitor() {
        @Override // Callback for byte code method instructions
        public void visitMethodInsn(int opcode, String owner, 
            String name, String desc) {
          System.out.println("Method " + name + " was called on " + owner);
        }
        @Override // Callback for byte code field instructions
        public void visitFieldInsn(int opcode, String owner, 
            String name, String desc) {
          System.out.println("Field " + name + " was accessed on " + owner);
        }
      }
    }
    return null;
  }
}
我没有在代码段中包含构造函数参数。如果
compareTo
方法可能被重载,则必须对调用的方法进行进一步检查。此外,您可能需要进一步检查方法指令的描述符和所有者,这两个概念将在中详细讨论。您可以利用该类简化任务


根据您对
方法的了解,逻辑越简单。

除了简单地确定访问哪些字段外,还需要进行某种程度的数据流分析。我可能会从源代码开始。我希望ASM的文档中包含一些示例。。。