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

时间:2014-03-17 11:10:44

标签: java java-bytecode-asm

假设没有可用源代码的java类,我们只有.class文件。该类实现了JDK的Comparable接口。我想以编程方式了解哪些字段/ getter compareTo方法访问。

使用asm字节码库我想获得在某种方法中调用的所有getter或字段访问的列表。有没有可用的代码示例?

1 个答案:

答案 0 :(得分:1)

使用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 manual中详细讨论过。您可以使用Type类来简化任务。

根据您对compareTo方法的了解,逻辑将更简单。