我想跟踪所有方法调用。我还有一个名为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();
}
}
答案 0 :(得分:0)
你没有描述出了什么问题......你能否详细说明一下?
两个指针:
1.在执行自己的代码之前visitCode()
调用super.visitCode()
。
答案 1 :(得分:-2)
转储ASM并切换到更简单的Javaassist。它对操作码的控制较少,但会更快地到达那里。你不需要担心微小的错误,比如你的" visitMethodInsn"调用(和更复杂的字节码问题)。