这次我们的目标是在Demo App启动后在MainActivity的onCreate()方法之前自动输出一段简朴的日记信息“Log.e("TAG", "===== This is just a test message =====");”也就是终极我们必要将这个 代码插入到MainActivity的onCreate()方法之前。**
经过上一步ClassVisitor的处理处罚我们已经匹配到onCreate方法了,此时我们必要在DemoMethodVisitor类中进行插入字节码操纵。如下所示,直接继承自MethodVisitor,并覆写visitCode()方法。此中的代码就是我们要插入的代码了,乍一看完全不是我们平常那种Log.e("TAG", "===== This is just a test message =====");的写法,而是复杂了很多。是的,这时间你就知道visitCode中的代码和我们上边的Log信息等价就好了,等这篇文章阅读完,咱们就可以去深入学习JVM字节码的相干信息了,现在不要想那么多,直接拿去用。
DemoMethodVisitor类源码如下:
class DemoMethodVisitor(methodVisitor: MethodVisitor) : MethodVisitor(Opcodes.ASM5, methodVisitor) { //插入:Log.e("TAG", "===== This is just a test message ====="); override fun visitCode() { super.visitCode() mv.visitLdcInsn("TAG") mv.visitLdcInsn("===== This is just a test message cjh=====") mv.visitMethodInsn( Opcodes.INVOKESTATIC, "android/util/Log", "e", "(Ljava/lang/String;Ljava/lang/String;)I", false ) mv.visitInsn(Opcodes.POP) }}2.3、Transform