这个例子是:计算一个方法的耗时,进入方法时记录时间,退出方法时计算时间差
public class MoonMethodVisitor extends AdviceAdapter {
private int currentTimeVarIndex;//其实是一个编号,给后面的load和store用
public MoonMethodVisitor(MethodVisitor methodVisitor, final int access,
final String name,
final String descriptor) {
super(Opcodes.ASM6, methodVisitor, access, name, descriptor);
}
@Override
protected void onMethodEnter() {
super.onMethodEnter();
//这里相当于 long currentTime = System.currentTimeMillis();
currentTimeVarIndex = newLocal(Type.LONG_TYPE);//创建一个局部变量
//INVOKESTATIC java/lang/System.currentTimeMillis ()J
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
mv.visitVarInsn(LSTORE, time);
}
@Override
protected void onMethodExit(int opcode) {
super.onMethodExit(opcode);
//这里相当于 System.out.println(System.currentTimeMillis() - currentTime);
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
//INVOKESTATIC java/lang/System.currentTimeMillis ()J
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
//LLOAD 0
mv.visitVarInsn(Opcodes.LLOAD, currentTimeVarIndex);
//LSUB
mv.visitInsn(Opcodes.LSUB);
//INVOKEVIRTUAL java/io/PrintStream.println (J)V
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V", false);
}
}
统计方法耗时