ASM Keep方法调用日志

时间:2015-06-25 08:29:22

标签: java logging bytecode java-bytecode-asm

我想跟踪所有方法调用。我还有一个名为writerTest的类。所以我想在每个方法的开头添加writerTest.print(FullMethodName)的方法调用。我努力了。找到一些关于它的教程,但我无法处理。这是我的代码。在这个特定的例子中,我可以在第一行添加方法调用。但我无法使用ALOAD 0等获取方法名称.ALOAD 0得到此信息。如果我使用 visitMethodInsn 而不是visitcode,结果是错误的

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class MyInstrumenter {
public static void main(final String args[]) throws Exception {
    FileInputStream is = new FileInputStream(args[0]);
    byte[] b;

    ClassReader cr = new ClassReader(is);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    ClassVisitor cv = new ClassAdapter(cw);
    cr.accept(cv, 0);
    b = cw.toByteArray();

    FileOutputStream fos = new FileOutputStream(args[1]);
    fos.write(b);
    fos.close();
  }
 }

类适配器类

class ClassAdapter extends ClassVisitor implements Opcodes {

public ClassAdapter(final ClassVisitor cv) {
    super(ASM5, cv);
}

@Override
public MethodVisitor visitMethod(final int access,
                                 final String name,
                                 final String desc,
                                 String signature,
                                 String[] exceptions) {
    MethodVisitor mv = cv.visitMethod(access, name, desc, signature,     exceptions);
    return new MethodAdapter(mv) ;
  }
}

方法适配器类

class MethodAdapter extends MethodVisitor implements Opcodes {

public MethodAdapter(final MethodVisitor mv) {
    super(ASM5, mv);
}

 @Override
 public void visitCode() {

     mv.visitVarInsn(Opcodes.ALOAD, 0);
     mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/yunus/test", "print", "      (Ljava/lang/Object;)V",false);
     super.visitCode();

  }
 }

2 个答案:

答案 0 :(得分:0)

你没有描述出了什么问题......你能否详细说明一下?

两个指针:   1.在执行自己的代码之前visitCode()调用super.visitCode()

  1. 您编写的代码在应用于静态方法时无法正常工作(ALOAD 0赢了"这")

答案 1 :(得分:-2)

转储ASM并切换到更简单的Javaassist。它对操作码的控制较少,但会更快地到达那里。你不需要担心微小的错误,比如你的" visitMethodInsn"调用(和更复杂的字节码问题)。