今天想使用ASM往每个方法入口插入日志,实现是这样的
@Override
public org.objectweb.asm.MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
org.objectweb.asm.MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
return new AdviceAdapter(Constants.ASM_API, mv, access, name, descriptor) {
@Override
protected void onMethodEnter() {
super.onMethodEnter();
mv.visitLdcInsn("owenli");
mv.visitLdcInsn("test");
mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "e", "(Ljava/lang/String;Ljava/lang/String;)I", false);
}
};
}
期望达到的效果是往每个方法的入口加入这行代码
Log.e("owenli","test");
但是在使用插件的时候会报异常
定位发现,原来Log.e方法会返回一个int值,所以解决方法是加上visitInsn(POP)
@Override
protected void onMethodEnter() {
super.onMethodEnter();
mv.visitLdcInsn("owenli");
mv.visitLdcInsn("test");
mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "e", "(Ljava/lang/String;Ljava/lang/String;)I", false);
mv.visitInsn(POP);
}