3
3
import org .objectweb .asm .ClassVisitor ;
4
4
import org .objectweb .asm .MethodVisitor ;
5
5
import org .objectweb .asm .Opcodes ;
6
+ import org .objectweb .asm .Type ;
6
7
import org .objectweb .asm .commons .AdviceAdapter ;
7
8
8
9
class BClassVisitor extends ClassVisitor {
@@ -14,16 +15,35 @@ class BClassVisitor extends ClassVisitor {
14
15
@ Override
15
16
public MethodVisitor visitMethod (int access , String name , String descriptor , String signature , String [] exceptions ) {
16
17
MethodVisitor visitor = super .visitMethod (access , name , descriptor , signature , exceptions );
18
+ // AdviceAdapter 是 MethodVisitor 的子类,使用 AdviceAdapter 可以更方便的修改方法的字节码。
19
+ // AdviceAdapter其中几个重要方法如下:
20
+ // void visitCode():表示 ASM 开始扫描这个方法
21
+ // void onMethodEnter():进入这个方法
22
+ // void onMethodExit():即将从这个方法出去
23
+ // void onVisitEnd():表示方法扫描完毕
17
24
MethodVisitor newVisitor = new AdviceAdapter (Opcodes .ASM5 , visitor , access , name , descriptor ) {
25
+
18
26
@ Override
19
27
protected void onMethodEnter () {
20
- System .out .println ("access:" + access + ", name:" + name + " , descriptor:" + descriptor + " ===> onMethodEnter" );
28
+ int slotIndex = newLocal (Type .LONG_TYPE );
29
+ visitMethodInsn (INVOKESTATIC , "java/lang/System" , "currentTimeMillis" , "()J" , false );
30
+ visitVarInsn (LSTORE , slotIndex );
31
+ visitLdcInsn ("zly_1111" );
32
+ visitLdcInsn ("\u8f93 \u51fa \u65f6 \u95f4 " );
33
+ visitVarInsn (LLOAD , slotIndex );
34
+ visitMethodInsn (INVOKESTATIC , "java/lang/Long" , "valueOf" , "(J)Ljava/lang/Long;" , false );
35
+ visitMethodInsn (INVOKESTATIC , "kotlin/jvm/internal/Intrinsics" , "stringPlus" , "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;" , false );
36
+ visitMethodInsn (INVOKESTATIC , "android/util/Log" , "e" , "(Ljava/lang/String;Ljava/lang/String;)I" , false );
37
+ visitInsn (POP );
21
38
super .onMethodEnter ();
22
39
}
23
40
24
41
@ Override
25
42
protected void onMethodExit (int opcode ) {
26
- System .out .println ("access:" + access + ", name:" + name + " , descriptor:" + descriptor + " ===> onMethodExit opcode:$opcode <===" );
43
+ visitLdcInsn ("zly_1111" );
44
+ visitLdcInsn ("test get result" );
45
+ visitMethodInsn (INVOKESTATIC , "android/util/Log" , "e" , "(Ljava/lang/String;Ljava/lang/String;)I" , false );
46
+ visitInsn (POP );
27
47
super .onMethodExit (opcode );
28
48
}
29
49
};
0 commit comments