這個(gè)例子是:計(jì)算一個(gè)方法的耗時(shí)审残,進(jìn)入方法時(shí)記錄時(shí)間秸抚,退出方法時(shí)計(jì)算時(shí)間差
public class MoonMethodVisitor extends AdviceAdapter {
private int currentTimeVarIndex;//其實(shí)是一個(gè)編號(hào),給后面的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();
//這里相當(dāng)于 long currentTime = System.currentTimeMillis();
currentTimeVarIndex = newLocal(Type.LONG_TYPE);//創(chuàng)建一個(gè)局部變量
//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);
//這里相當(dāng)于 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);
}
}
統(tǒng)計(jì)方法耗時(shí)