ASM读取class信息

Java asm读取class信息

[TOC]

1 class文件查看方式

1.1 使用jdk提供的javap命令

  • 1.1.1 javap

    javap 用法: javap <options> <classes> 其中, 可能的选项包括: -help --help -? 输出此用法消息 -version 版本信息 -v -verbose 输出附加信息 -l 输出行号和本地变量表 -public 仅显示公共类和成员 -protected 显示受保护的/公共类和成员 -package 显示程序包/受保护的/公共类 和成员 (默认) -p -private 显示所有类和成员 -c 对代码进行反汇编 -s 输出内部类型签名 -sysinfo 显示正在处理的类的 系统信息 (路径, 大小, 日期, MD5 散列) -constants 显示最终常量 -classpath <path> 指定查找用户类文件的位置 -cp <path> 指定查找用户类文件的位置 -bootclasspath <path> 覆盖引导类文件的位置

  • 1.1.2 使用javap命令查看项目中main.jar中的BusIndex.class

    javap -v -cp ./main.jar com.eventbus.gen.BusIndex

1.2 使用反编译工具Luyten

  • 1.2.1 用luyten打开main.jar

  • 1.2.2 选项Settings/Bytecode

  • 1.2.3 在Structure中选中BusIndex.class

1.3 反编译结果

1javap -v -cp ./main.jar com.eventbus.gen.BusIndex 2Classfile jar:file:/D:/projects/Sample/ASMSample/app/libs/main.jar!/com/eventbus/gen/BusIndex.class 3 Last modified 2016-10-10; size 1193 bytes 4 MD5 checksum 4ac635858d4c2533a29accf9d634f49b 5 Compiled from "SourceFile" 6public final class com.eventbus.gen.BusIndex extends com.a.a.c.a 7 minor version: 0 8 major version: 51 9 flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER 10Constant pool: 11 #1 = String #52 // showMessage 12 #2 = String #53 // showMessagedd 13 #3 = Class #38 // com/a/a/c/a 14 #4 = Class #39 // com/a/a/c/d 15 #5 = Class #40 // com/a/a/d/a 16 #6 = Class #41 // com/eventbus/gen/BusIndex 17 #7 = Class #42 // com/eventbus/gen/a 18 #8 = Class #43 // com/eventbus/gen/b 19 #9 = Class #44 // com/eventbus/gen/c 20 #10 = Class #45 // com/eventbus/gen/d 21 #11 = Class #46 // com/sample/app/Main2Activity 22 #12 = Class #47 // com/sample/app/MainActivity 23 #13 = Class #48 // com/sample/app/MainActivity$a 24 #14 = Class #51 // java/lang/Object 25 #15 = Methodref #3.#23 // com/a/a/c/a."<init>":()V 26 #16 = Methodref #4.#23 // com/a/a/c/d."<init>":()V 27 #17 = Methodref #4.#25 // com/a/a/c/d.a:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 28 #18 = Methodref #7.#24 // com/eventbus/gen/a."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 29 #19 = Methodref #8.#24 // com/eventbus/gen/b."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 30 #20 = Methodref #9.#24 // com/eventbus/gen/c."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 31 #21 = Methodref #10.#24 // com/eventbus/gen/d."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 32 #22 = Methodref #14.#26 // java/lang/Object.getClass:()Ljava/lang/Class; 33 #23 = NameAndType #32:#28 // "<init>":()V 34 #24 = NameAndType #32:#29 // "<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 35 #25 = NameAndType #37:#31 // a:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 36 #26 = NameAndType #50:#27 // getClass:()Ljava/lang/Class; 37 #27 = Utf8 ()Ljava/lang/Class; 38 #28 = Utf8 ()V 39 #29 = Utf8 (Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 40 #30 = Utf8 (Ljava/lang/Object;)Lcom/a/a/c/d; 41 #31 = Utf8 (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 42 #32 = Utf8 <init> 43 #33 = Utf8 Code 44 #34 = Utf8 InnerClasses 45 #35 = Utf8 LineNumberTable 46 #36 = Utf8 SourceFile 47 #37 = Utf8 a 48 #38 = Utf8 com/a/a/c/a 49 #39 = Utf8 com/a/a/c/d 50 #40 = Utf8 com/a/a/d/a 51 #41 = Utf8 com/eventbus/gen/BusIndex 52 #42 = Utf8 com/eventbus/gen/a 53 #43 = Utf8 com/eventbus/gen/b 54 #44 = Utf8 com/eventbus/gen/c 55 #45 = Utf8 com/eventbus/gen/d 56 #46 = Utf8 com/sample/app/Main2Activity 57 #47 = Utf8 com/sample/app/MainActivity 58 #48 = Utf8 com/sample/app/MainActivity$a 59 #49 = Utf8 generateSubscribeMethodIndex 60 #50 = Utf8 getClass 61 #51 = Utf8 java/lang/Object 62 #52 = Utf8 showMessage 63 #53 = Utf8 showMessagedd 64{ 65 public com.eventbus.gen.BusIndex(); 66 descriptor: ()V 67 flags: ACC_PUBLIC 68 Code: 69 stack=1, locals=1, args_size=1 70 0: aload_0 71 1: invokespecial #15 // Method com/a/a/c/a."<init>":()V 72 4: return 73 LineNumberTable: 74 line 15: 0 75 76 public com.a.a.c.d generateSubscribeMethodIndex(java.lang.Object); 77 descriptor: (Ljava/lang/Object;)Lcom/a/a/c/d; 78 flags: ACC_PUBLIC 79 Code: 80 stack=11, locals=7, args_size=2 81 0: new #4 // class com/a/a/c/d 82 3: dup 83 4: invokespecial #16 // Method com/a/a/c/d."<init>":()V 84 7: astore_2 85 8: aload_1 86 9: invokevirtual #22 // Method java/lang/Object.getClass:()Ljava/lang/Class; 87 12: astore_3 88 13: aconst_null 89 14: astore 4 90 16: aconst_null 91 17: astore 5 92 19: aconst_null 93 20: astore 6 94 22: aload_3 95 23: ldc #12 // class com/sample/app/MainActivity 96 25: if_acmpne 104 97 28: ldc #13 // class com/sample/app/MainActivity$a 98 30: astore 4 99 32: ldc #5 // class com/a/a/d/a 100 34: astore 5 101 36: ldc #1 // String showMessage 102 38: astore 6 103 40: aload_2 104 41: aload 6 105 43: aload 4 106 45: aload 5 107 47: new #7 // class com/eventbus/gen/a 108 50: dup 109 51: aload_0 110 52: aload_1 111 53: aload 6 112 55: aload 4 113 57: aload 5 114 59: invokespecial #18 // Method com/eventbus/gen/a."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 115 62: invokevirtual #17 // Method com/a/a/c/d.a:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 116 65: ldc #13 // class com/sample/app/MainActivity$a 117 67: astore 4 118 69: ldc #5 // class com/a/a/d/a 119 71: astore 5 120 73: ldc #2 // String showMessagedd 121 75: astore 6 122 77: aload_2 123 78: aload 6 124 80: aload 4 125 82: aload 5 126 84: new #8 // class com/eventbus/gen/b 127 87: dup 128 88: aload_0 129 89: aload_1 130 90: aload 6 131 92: aload 4 132 94: aload 5 133 96: invokespecial #19 // Method com/eventbus/gen/b."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 134 99: invokevirtual #17 // Method com/a/a/c/d.a:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 135 102: aload_2 136 103: areturn 137 104: aload_3 138 105: ldc #11 // class com/sample/app/Main2Activity 139 107: if_acmpne 186 140 110: ldc #13 // class com/sample/app/MainActivity$a 141 112: astore 4 142 114: ldc #5 // class com/a/a/d/a 143 116: astore 5 144 118: ldc #1 // String showMessage 145 120: astore 6 146 122: aload_2 147 123: aload 6 148 125: aload 4 149 127: aload 5 150 129: new #9 // class com/eventbus/gen/c 151 132: dup 152 133: aload_0 153 134: aload_1 154 135: aload 6 155 137: aload 4 156 139: aload 5 157 141: invokespecial #20 // Method com/eventbus/gen/c."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 158 144: invokevirtual #17 // Method com/a/a/c/d.a:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 159 147: ldc #13 // class com/sample/app/MainActivity$a 160 149: astore 4 161 151: ldc #5 // class com/a/a/d/a 162 153: astore 5 163 155: ldc #2 // String showMessagedd 164 157: astore 6 165 159: aload_2 166 160: aload 6 167 162: aload 4 168 164: aload 5 169 166: new #10 // class com/eventbus/gen/d 170 169: dup 171 170: aload_0 172 171: aload_1 173 172: aload 6 174 174: aload 4 175 176: aload 5 176 178: invokespecial #21 // Method com/eventbus/gen/d."<init>":(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V 177 181: invokevirtual #17 // Method com/a/a/c/d.a:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V 178 184: aload_2 179 185: areturn 180 186: aload_2 181 187: areturn 182 LineNumberTable: 183 line 18: 0 184 line 19: 8 185 line 20: 13 186 line 21: 16 187 line 22: 19 188 line 23: 22 189 line 24: 28 190 line 25: 32 191 line 26: 36 192 line 27: 40 193 line 33: 65 194 line 34: 69 195 line 35: 73 196 line 36: 77 197 line 42: 102 198 line 44: 104 199 line 45: 110 200 line 46: 114 201 line 47: 118 202 line 48: 122 203 line 54: 147 204 line 55: 151 205 line 56: 155 206 line 57: 159 207 line 63: 184 208 line 65: 186 209} 210InnerClasses: 211 #10; //class com/eventbus/gen/d 212 #9; //class com/eventbus/gen/c 213 #8; //class com/eventbus/gen/b 214 #7; //class com/eventbus/gen/a 215 public static #37= #13 of #12; //a=class com/sample/app/MainActivity$a of class com/sample/app/MainActivity 216SourceFile: "SourceFile"

2 asm中与class中的指令和类型映射


2.1 Opcodes中的指令

1public interface Opcodes { 2 3 // ASM API versions 4 5 int ASM4 = 4 << 16 | 0 << 8 | 0; 6 int ASM5 = 5 << 16 | 0 << 8 | 0; 7 int ASM6 = 6 << 16 | 0 << 8 | 0; 8 9 // versions 10 11 int V1_1 = 3 << 16 | 45; 12 int V1_2 = 0 << 16 | 46; 13 int V1_3 = 0 << 16 | 47; 14 int V1_4 = 0 << 16 | 48; 15 int V1_5 = 0 << 16 | 49; 16 int V1_6 = 0 << 16 | 50; 17 int V1_7 = 0 << 16 | 51; 18 int V1_8 = 0 << 16 | 52; 19 int V1_9 = 0 << 16 | 53; 20 21 // access flags 22 23 int ACC_PUBLIC = 0x0001; // class, field, method 24 int ACC_PRIVATE = 0x0002; // class, field, method 25 int ACC_PROTECTED = 0x0004; // class, field, method 26 int ACC_STATIC = 0x0008; // field, method 27 int ACC_FINAL = 0x0010; // class, field, method, parameter 28 int ACC_SUPER = 0x0020; // class 29 int ACC_SYNCHRONIZED = 0x0020; // method 30 int ACC_VOLATILE = 0x0040; // field 31 int ACC_BRIDGE = 0x0040; // method 32 int ACC_VARARGS = 0x0080; // method 33 int ACC_TRANSIENT = 0x0080; // field 34 int ACC_NATIVE = 0x0100; // method 35 int ACC_INTERFACE = 0x0200; // class 36 int ACC_ABSTRACT = 0x0400; // class, method 37 int ACC_STRICT = 0x0800; // method 38 int ACC_SYNTHETIC = 0x1000; // class, field, method, parameter 39 int ACC_ANNOTATION = 0x2000; // class 40 int ACC_ENUM = 0x4000; // class(?) field inner 41 int ACC_MANDATED = 0x8000; // parameter 42 int ACC_MODULE = 0x8000; // class 43 44 // ASM specific pseudo access flags 45 46 int ACC_DEPRECATED = 0x20000; // class, field, method 47 48 // types for NEWARRAY 49 50 int T_BOOLEAN = 4; 51 int T_CHAR = 5; 52 int T_FLOAT = 6; 53 int T_DOUBLE = 7; 54 int T_BYTE = 8; 55 int T_SHORT = 9; 56 int T_INT = 10; 57 int T_LONG = 11; 58 59 // tags for Handle 60 61 int H_GETFIELD = 1; 62 int H_GETSTATIC = 2; 63 int H_PUTFIELD = 3; 64 int H_PUTSTATIC = 4; 65 int H_INVOKEVIRTUAL = 5; 66 int H_INVOKESTATIC = 6; 67 int H_INVOKESPECIAL = 7; 68 int H_NEWINVOKESPECIAL = 8; 69 int H_INVOKEINTERFACE = 9; 70 71 // stack map frame types 72 73 /** 74 * Represents an expanded frame. See {@link ClassReader#EXPAND_FRAMES}. 75 */ 76 int F_NEW = -1; 77 78 /** 79 * Represents a compressed frame with complete frame data. 80 */ 81 int F_FULL = 0; 82 83 /** 84 * Represents a compressed frame where locals are the same as the locals in 85 * the previous frame, except that additional 1-3 locals are defined, and 86 * with an empty stack. 87 */ 88 int F_APPEND = 1; 89 90 /** 91 * Represents a compressed frame where locals are the same as the locals in 92 * the previous frame, except that the last 1-3 locals are absent and with 93 * an empty stack. 94 */ 95 int F_CHOP = 2; 96 97 /** 98 * Represents a compressed frame with exactly the same locals as the 99 * previous frame and with an empty stack. 100 */ 101 int F_SAME = 3; 102 103 /** 104 * Represents a compressed frame with exactly the same locals as the 105 * previous frame and with a single value on the stack. 106 */ 107 int F_SAME1 = 4; 108 109 // Do not try to change the following code to use auto-boxing, 110 // these values are compared by reference and not by value 111 // The constructor of Integer was deprecated in 9 112 // but we are stuck with it by backward compatibility 113 @SuppressWarnings("deprecation") Integer TOP = new Integer(0); 114 @SuppressWarnings("deprecation") Integer INTEGER = new Integer(1); 115 @SuppressWarnings("deprecation") Integer FLOAT = new Integer(2); 116 @SuppressWarnings("deprecation") Integer DOUBLE = new Integer(3); 117 @SuppressWarnings("deprecation") Integer LONG = new Integer(4); 118 @SuppressWarnings("deprecation") Integer NULL = new Integer(5); 119 @SuppressWarnings("deprecation") Integer UNINITIALIZED_THIS = new Integer(6); 120 121 // opcodes // visit method (- = idem) 122 123 int NOP = 0; // visitInsn 124 int ACONST_NULL = 1; // - 125 int ICONST_M1 = 2; // - 126 int ICONST_0 = 3; // - 127 int ICONST_1 = 4; // - 128 int ICONST_2 = 5; // - 129 int ICONST_3 = 6; // - 130 int ICONST_4 = 7; // - 131 int ICONST_5 = 8; // - 132 int LCONST_0 = 9; // - 133 int LCONST_1 = 10; // - 134 int FCONST_0 = 11; // - 135 int FCONST_1 = 12; // - 136 int FCONST_2 = 13; // - 137 int DCONST_0 = 14; // - 138 int DCONST_1 = 15; // - 139 int BIPUSH = 16; // visitIntInsn 140 int SIPUSH = 17; // - 141 int LDC = 18; // visitLdcInsn 142 // int LDC_W = 19; // - 143 // int LDC2_W = 20; // - 144 int ILOAD = 21; // visitVarInsn 145 int LLOAD = 22; // - 146 int FLOAD = 23; // - 147 int DLOAD = 24; // - 148 int ALOAD = 25; // - 149 // int ILOAD_0 = 26; // - 150 // int ILOAD_1 = 27; // - 151 // int ILOAD_2 = 28; // - 152 // int ILOAD_3 = 29; // - 153 // int LLOAD_0 = 30; // - 154 // int LLOAD_1 = 31; // - 155 // int LLOAD_2 = 32; // - 156 // int LLOAD_3 = 33; // - 157 // int FLOAD_0 = 34; // - 158 // int FLOAD_1 = 35; // - 159 // int FLOAD_2 = 36; // - 160 // int FLOAD_3 = 37; // - 161 // int DLOAD_0 = 38; // - 162 // int DLOAD_1 = 39; // - 163 // int DLOAD_2 = 40; // - 164 // int DLOAD_3 = 41; // - 165 // int ALOAD_0 = 42; // - 166 // int ALOAD_1 = 43; // - 167 // int ALOAD_2 = 44; // - 168 // int ALOAD_3 = 45; // - 169 int IALOAD = 46; // visitInsn 170 int LALOAD = 47; // - 171 int FALOAD = 48; // - 172 int DALOAD = 49; // - 173 int AALOAD = 50; // - 174 int BALOAD = 51; // - 175 int CALOAD = 52; // - 176 int SALOAD = 53; // - 177 int ISTORE = 54; // visitVarInsn 178 int LSTORE = 55; // - 179 int FSTORE = 56; // - 180 int DSTORE = 57; // - 181 int ASTORE = 58; // - 182 // int ISTORE_0 = 59; // - 183 // int ISTORE_1 = 60; // - 184 // int ISTORE_2 = 61; // - 185 // int ISTORE_3 = 62; // - 186 // int LSTORE_0 = 63; // - 187 // int LSTORE_1 = 64; // - 188 // int LSTORE_2 = 65; // - 189 // int LSTORE_3 = 66; // - 190 // int FSTORE_0 = 67; // - 191 // int FSTORE_1 = 68; // - 192 // int FSTORE_2 = 69; // - 193 // int FSTORE_3 = 70; // - 194 // int DSTORE_0 = 71; // - 195 // int DSTORE_1 = 72; // - 196 // int DSTORE_2 = 73; // - 197 // int DSTORE_3 = 74; // - 198 // int ASTORE_0 = 75; // - 199 // int ASTORE_1 = 76; // - 200 // int ASTORE_2 = 77; // - 201 // int ASTORE_3 = 78; // - 202 int IASTORE = 79; // visitInsn 203 int LASTORE = 80; // - 204 int FASTORE = 81; // - 205 int DASTORE = 82; // - 206 int AASTORE = 83; // - 207 int BASTORE = 84; // - 208 int CASTORE = 85; // - 209 int SASTORE = 86; // - 210 int POP = 87; // - 211 int POP2 = 88; // - 212 int DUP = 89; // - 213 int DUP_X1 = 90; // - 214 int DUP_X2 = 91; // - 215 int DUP2 = 92; // - 216 int DUP2_X1 = 93; // - 217 int DUP2_X2 = 94; // - 218 int SWAP = 95; // - 219 int IADD = 96; // - 220 int LADD = 97; // - 221 int FADD = 98; // - 222 int DADD = 99; // - 223 int ISUB = 100; // - 224 int LSUB = 101; // - 225 int FSUB = 102; // - 226 int DSUB = 103; // - 227 int IMUL = 104; // - 228 int LMUL = 105; // - 229 int FMUL = 106; // - 230 int DMUL = 107; // - 231 int IDIV = 108; // - 232 int LDIV = 109; // - 233 int FDIV = 110; // - 234 int DDIV = 111; // - 235 int IREM = 112; // - 236 int LREM = 113; // - 237 int FREM = 114; // - 238 int DREM = 115; // - 239 int INEG = 116; // - 240 int LNEG = 117; // - 241 int FNEG = 118; // - 242 int DNEG = 119; // - 243 int ISHL = 120; // - 244 int LSHL = 121; // - 245 int ISHR = 122; // - 246 int LSHR = 123; // - 247 int IUSHR = 124; // - 248 int LUSHR = 125; // - 249 int IAND = 126; // - 250 int LAND = 127; // - 251 int IOR = 128; // - 252 int LOR = 129; // - 253 int IXOR = 130; // - 254 int LXOR = 131; // - 255 int IINC = 132; // visitIincInsn 256 int I2L = 133; // visitInsn 257 int I2F = 134; // - 258 int I2D = 135; // - 259 int L2I = 136; // - 260 int L2F = 137; // - 261 int L2D = 138; // - 262 int F2I = 139; // - 263 int F2L = 140; // - 264 int F2D = 141; // - 265 int D2I = 142; // - 266 int D2L = 143; // - 267 int D2F = 144; // - 268 int I2B = 145; // - 269 int I2C = 146; // - 270 int I2S = 147; // - 271 int LCMP = 148; // - 272 int FCMPL = 149; // - 273 int FCMPG = 150; // - 274 int DCMPL = 151; // - 275 int DCMPG = 152; // - 276 int IFEQ = 153; // visitJumpInsn 277 int IFNE = 154; // - 278 int IFLT = 155; // - 279 int IFGE = 156; // - 280 int IFGT = 157; // - 281 int IFLE = 158; // - 282 int IF_ICMPEQ = 159; // - 283 int IF_ICMPNE = 160; // - 284 int IF_ICMPLT = 161; // - 285 int IF_ICMPGE = 162; // - 286 int IF_ICMPGT = 163; // - 287 int IF_ICMPLE = 164; // - 288 int IF_ACMPEQ = 165; // - 289 int IF_ACMPNE = 166; // - 290 int GOTO = 167; // - 291 int JSR = 168; // - 292 int RET = 169; // visitVarInsn 293 int TABLESWITCH = 170; // visiTableSwitchInsn 294 int LOOKUPSWITCH = 171; // visitLookupSwitch 295 int IRETURN = 172; // visitInsn 296 int LRETURN = 173; // - 297 int FRETURN = 174; // - 298 int DRETURN = 175; // - 299 int ARETURN = 176; // - 300 int RETURN = 177; // - 301 int GETSTATIC = 178; // visitFieldInsn 302 int PUTSTATIC = 179; // - 303 int GETFIELD = 180; // - 304 int PUTFIELD = 181; // - 305 int INVOKEVIRTUAL = 182; // visitMethodInsn 306 int INVOKESPECIAL = 183; // - 307 int INVOKESTATIC = 184; // - 308 int INVOKEINTERFACE = 185; // - 309 int INVOKEDYNAMIC = 186; // visitInvokeDynamicInsn 310 int NEW = 187; // visitTypeInsn 311 int NEWARRAY = 188; // visitIntInsn 312 int ANEWARRAY = 189; // visitTypeInsn 313 int ARRAYLENGTH = 190; // visitInsn 314 int ATHROW = 191; // - 315 int CHECKCAST = 192; // visitTypeInsn 316 int INSTANCEOF = 193; // - 317 int MONITORENTER = 194; // visitInsn 318 int MONITOREXIT = 195; // - 319 // int WIDE = 196; // NOT VISITED 320 int MULTIANEWARRAY = 197; // visitMultiANewArrayInsn 321 int IFNULL = 198; // visitJumpInsn 322 int IFNONNULL = 199; // - 323 // int GOTO_W = 200; // - 324 // int JSR_W = 201; // - 325}

3 asm中使用ClassReader读取.class信息

3.1 ClassReader提供四个构造方法用来加载class

1public ClassReader(final byte[] b) 2public ClassReader(final InputStream is) 3public ClassReader(final String name) 4public ClassReader(final byte[] b, final int off, final int len)

3.2 读取BusIndex.class基本信息

  • 3.2.1 加载class

    ClassReader classReader = new ClassReader(BusIndex.class.getName());

  • 3.2.2 获取类名

    classReader.getClassName()

  • 3.2.3 获取父类名

    classReader.getSuperName()

  • 3.2.4 获取接口

    classReader.getInterfaces()

3.3 打印class基本信息

1System.out.println(classReader.getClassName()); 2System.out.println(Arrays.toString(classReader.getInterfaces())); 3System.out.println(classReader.getSuperName());

3.4 控制台输出结果

1com/eventbus/gen/BusIndex 2[] 3com/a/a/c/a

3.5 使用ClassVisitor读取BusIndex.class详细信息

  • 3.5.1 ClassReader提供了 accept方法可以遍历class的具体信息,该方法有两个重载

    public void accept(final ClassVisitor classVisitor,final Attribute[] attrs, final int flags) public void accept(final ClassVisitor classVisitor,final int flags)

  • 3.5.2 其中参数ClassVisitor用来遍历class信息, flags用来设置遍历信息级别

  • 3.5.3 遍历class具体信息

    classReader.accept(new SimpleClassVisitor(), 0); static class SimpleClassVisitor extends ClassVisitor {

    1 public SimpleClassVisitor() { 2 super(Opcodes.ASM6); 3 } 4 5 @Override 6 public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { 7 super.visit(version, access, name, signature, superName, interfaces); 8 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", version:"+version+", access:"+access+", name:"+name+", signature:"+signature+", supperName:"+signature+", interfaces:"+ Arrays.toString(interfaces)); 9 10 } 11 12 @Override 13 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 14 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", desc:"+desc+", visible:"+visible); 15 16 return super.visitAnnotation(desc, visible); 17 } 18 19 @Override 20 public void visitAttribute(Attribute attr) { 21 super.visitAttribute(attr); 22 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", attr:"+attr); 23 24 } 25 26 @Override 27 public void visitEnd() { 28 super.visitEnd(); 29 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); 30 31 } 32 33 @Override 34 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { 35 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", access:"+access+", name:"+name+", desc:"+desc+", signature:"+signature+", value:"+value); 36 37 return super.visitField(access, name, desc, signature, value); 38 } 39 40 @Override 41 public void visitInnerClass(String name, String outerName, String innerName, int access) { 42 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", name:"+name+", outerName:"+outerName+", innerName:"+innerName+", access:"+access); 43 44 super.visitInnerClass(name, outerName, innerName, access); 45 } 46 47 @Override 48 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { 49 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", access:"+access+", name:"+name+", desc:"+desc+", signature:"+signature+", exceptions:"+Arrays.toString(exceptions)); 50 51 52 return super.visitMethod(access, name, desc, signature, exceptions); 53 } 54 55 @Override 56 public ModuleVisitor visitModule() { 57 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); 58 59 return super.visitModule(); 60 } 61 62 @Override 63 public void visitOuterClass(String owner, String name, String desc) { 64 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", owner:"+owner+", name:"+name+", desc:"+desc); 65 66 super.visitOuterClass(owner, name, desc); 67 } 68 69 @Override 70 public void visitSource(String source, String debug) { 71 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", source:"+source+", debug:"+debug); 72 73 super.visitSource(source, debug); 74 } 75 76 @Override 77 public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { 78 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", typeRef:"+typeRef+", typePath:"+typePath+", desc:"+desc+", visible:"+visible); 79 80 return super.visitTypeAnnotation(typeRef, typePath, desc, visible); 81 } 82}
  • 3.5.4 控制台输出结果

    visit, version:51, access:49, name:com/eventbus/gen/BusIndex, signature:null, supperName:null, interfaces:[] visitSource, source:SourceFile, debug:null visitInnerClass, name:com/eventbus/gen/d, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/c, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/b, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/a, outerName:null, innerName:null, access:0 visitInnerClass, name:com/sample/app/MainActivity$a, outerName:com/sample/app/MainActivity, innerName:a, access:9 visitMethod, access:1, name:<init>, desc:()V, signature:null, exceptions:null visitMethod, access:1, name:generateSubscribeMethodIndex, desc:(Ljava/lang/Object;)Lcom/a/a/c/d;, signature:null, exceptions:null visitEnd

  • 3.5.5 从输入结果中可以看出

    • version:

    version:51 与反编译结果一致

    • flags:

    access:49 与反编译结果一致Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_SUPER = 49

    • InnerClasses:

    visitInnerClass, name:com/eventbus/gen/d, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/c, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/b, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/a, outerName:null, innerName:null, access:0 visitInnerClass, name:com/sample/app/MainActivity$a, outerName:com/sample/app/MainActivity, innerName:a, access:9

    • method:

    visitMethod, access:1, name:<init>, desc:()V, signature:null, exceptions:null visitMethod, access:1, name:generateSubscribeMethodIndex, desc:(Ljava/lang/Object;)Lcom/a/a/c/d;, signature:null, exceptions:null

3.6 使用MethodVisitor读取BusIndex.class中方法的详细信息

  • 3.6.1 ClassVisitor的visitMethod只能获取方法的基本信息,如果要获取方法的详细信息就必须在visitMethod返回一个自定义的MethodVisitor。

    static class SimpleMethodVisitor extends MethodVisitor{ public SimpleMethodVisitor(MethodVisitor mv) { super(Opcodes.ASM6, mv); }

    1 @Override 2 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 3 4 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", desc:"+desc+", visible:"+visible); 5 6 return super.visitAnnotation(desc, visible); 7 } 8 9 @Override 10 public AnnotationVisitor visitAnnotationDefault() { 11 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); 12 13 return super.visitAnnotationDefault(); 14 } 15 16 @Override 17 public void visitAttribute(Attribute attr) { 18 super.visitAttribute(attr); 19 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", attr:"+attr); 20 } 21 22 @Override 23 public void visitCode() { 24 super.visitCode(); 25 System.out.println("visitor method begin."); 26 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); 27 28 } 29 30 @Override 31 public void visitEnd() { 32 super.visitEnd(); 33 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); 34 System.out.println("visitor method ended."); 35 } 36 37 @Override 38 public void visitFieldInsn(int opcode, String owner, String name, String desc) { 39 super.visitFieldInsn(opcode, owner, name, desc); 40 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+Optcodes.options.get(opcode)+", owner:"+owner+", name:"+name+", desc:"+desc); 41 42 } 43 44 @Override 45 public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { 46 super.visitFrame(type, nLocal, local, nStack, stack); 47 48 } 49 50 @Override 51 public void visitIincInsn(int var, int increment) { 52 super.visitIincInsn(var, increment); 53 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", var:"+var+", increment:"+increment); 54 55 } 56 57 @Override 58 public void visitInsn(int opcode) { 59 super.visitInsn(opcode); 60 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+Optcodes.options.get(opcode)); 61 62 } 63 64 @Override 65 public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { 66 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", typeRef:"+typeRef+", typePath:"+typePath+", desc:"+desc+", visible:"+visible); 67 68 return super.visitInsnAnnotation(typeRef, typePath, desc, visible); 69 } 70 71 @Override 72 public void visitIntInsn(int opcode, int operand) { 73 super.visitIntInsn(opcode, operand); 74 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+Optcodes.options.get(opcode)+", operand:"+operand); 75 76 } 77 78 @Override 79 public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { 80 super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); 81 } 82 83 @Override 84 public void visitJumpInsn(int opcode, Label label) { 85 super.visitJumpInsn(opcode, label); 86 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+Optcodes.options.get(opcode)+", label:"+label); 87 88 } 89 90 @Override 91 public void visitLabel(Label label) { 92 super.visitLabel(label); 93 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", label:"+label); 94 95 } 96 97 @Override 98 public void visitLdcInsn(Object cst) { 99 super.visitLdcInsn(cst); 100 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", cst:"+cst); 101 102 } 103 104 @Override 105 public void visitLineNumber(int line, Label start) { 106 super.visitLineNumber(line, start); 107 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", line:"+line+", start label:"+line); 108 } 109 110 @Override 111 public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { 112 super.visitLocalVariable(name, desc, signature, start, end, index); 113 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", name:"+name+", desc:"+desc+", signature:"+signature); 114 115 } 116 117 @Override 118 public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, String desc, boolean visible) { 119 return super.visitLocalVariableAnnotation(typeRef, typePath, start, end, index, desc, visible); 120 } 121 122 @Override 123 public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { 124 super.visitLookupSwitchInsn(dflt, keys, labels); 125 } 126 127 @Override 128 public void visitMaxs(int maxStack, int maxLocals) { 129 super.visitMaxs(maxStack, maxLocals); 130 } 131 132 133 134 @Override 135 public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { 136 super.visitMethodInsn(opcode, owner, name, desc, itf); 137 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+Optcodes.options.get(opcode)+", owner:"+owner+", name:"+name+", desc:"+desc); 138 139 } 140 141 @Override 142 public void visitMultiANewArrayInsn(String desc, int dims) { 143 super.visitMultiANewArrayInsn(desc, dims); 144 } 145 146 @Override 147 public void visitParameter(String name, int access) { 148 super.visitParameter(name, access); 149 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", name:"+name+", access:"+access); 150 151 } 152 153 @Override 154 public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { 155 return super.visitParameterAnnotation(parameter, desc, visible); 156 } 157 158 @Override 159 public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { 160 super.visitTableSwitchInsn(min, max, dflt, labels); 161 } 162 163 @Override 164 public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { 165 return super.visitTryCatchAnnotation(typeRef, typePath, desc, visible); 166 } 167 168 @Override 169 public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { 170 super.visitTryCatchBlock(start, end, handler, type); 171 } 172 173 @Override 174 public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { 175 return super.visitTypeAnnotation(typeRef, typePath, desc, visible); 176 177 } 178 179 @Override 180 public void visitTypeInsn(int opcode, String type) { 181 super.visitTypeInsn(opcode, type); 182 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+ Optcodes.options.get(opcode)+", type:"+type); 183 184 } 185 186 @Override 187 public void visitVarInsn(int opcode, int var) { 188 super.visitVarInsn(opcode, var); 189 System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", opcode:"+ Optcodes.options.get(opcode)+",var:"+var); 190 191 } 192}
  • 3.6.2 在ClassVisitor的visitMethod方法中使用SimpleMethodVisitor获取generateSubscribeMethodIndex方法的具体信息

    @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()+", access:"+access+", name:"+name+", desc:"+desc+", signature:"+signature+", exceptions:"+Arrays.toString(exceptions)); if(name.equals("generateSubscribeMethodIndex")){ return new SimpleMethodVisitor(methodVisitor); } return methodVisitor; }

  • 3.6.3 输出结果

    visit, version:51, access:49, name:com/eventbus/gen/BusIndex, signature:null, supperName:null, interfaces:[] visitSource, source:SourceFile, debug:null visitInnerClass, name:com/eventbus/gen/d, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/c, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/b, outerName:null, innerName:null, access:0 visitInnerClass, name:com/eventbus/gen/a, outerName:null, innerName:null, access:0 visitInnerClass, name:com/sample/app/MainActivity$a, outerName:com/sample/app/MainActivity, innerName:a, access:9 visitMethod, access:1, name:<init>, desc:()V, signature:null, exceptions:null visitMethod, access:1, name:generateSubscribeMethodIndex, desc:(Ljava/lang/Object;)Lcom/a/a/c/d;, signature:null, exceptions:null visitor method begin. visitCode visitLabel, label:L1072591677 visitLineNumber, line:18, start label:18 visitTypeInsn, opcode:NEW, type:com/a/a/c/d visitInsn, opcode:DUP visitMethodInsn, opcode:INVOKESPECIAL, owner:com/a/a/c/d, name:<init>, desc:()V visitVarInsn, opcode:ASTORE,var:2 visitLabel, label:L918221580 visitLineNumber, line:19, start label:19 visitVarInsn, opcode:ALOAD,var:1 visitMethodInsn, opcode:INVOKEVIRTUAL, owner:java/lang/Object, name:getClass, desc:()Ljava/lang/Class; visitVarInsn, opcode:ASTORE,var:3 visitLabel, label:L2055281021 visitLineNumber, line:20, start label:20 visitInsn, opcode:ACONST_NULL visitVarInsn, opcode:ASTORE,var:4 visitLabel, label:L1554547125 visitLineNumber, line:21, start label:21 visitInsn, opcode:ACONST_NULL visitVarInsn, opcode:ASTORE,var:5 visitLabel, label:L617901222 visitLineNumber, line:22, start label:22 visitInsn, opcode:ACONST_NULL visitVarInsn, opcode:ASTORE,var:6 visitLabel, label:L1159190947 visitLineNumber, line:23, start label:23 visitVarInsn, opcode:ALOAD,var:3 visitLdcInsn, cst:Lcom/sample/app/MainActivity; visitJumpInsn, opcode:IF_ACMPNE, label:L681842940 visitLabel, label:L1392838282 visitLineNumber, line:24, start label:24 visitLdcInsn, cst:Lcom/sample/app/MainActivity$a; visitVarInsn, opcode:ASTORE,var:4 visitLabel, label:L523429237 visitLineNumber, line:25, start label:25 visitLdcInsn, cst:Lcom/a/a/d/a; visitVarInsn, opcode:ASTORE,var:5 visitLabel, label:L664740647 visitLineNumber, line:26, start label:26 visitLdcInsn, cst:showMessage visitVarInsn, opcode:ASTORE,var:6 visitLabel, label:L804564176 visitLineNumber, line:27, start label:27 visitVarInsn, opcode:ALOAD,var:2 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitTypeInsn, opcode:NEW, type:com/eventbus/gen/a visitInsn, opcode:DUP visitVarInsn, opcode:ALOAD,var:0 visitVarInsn, opcode:ALOAD,var:1 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitMethodInsn, opcode:INVOKESPECIAL, owner:com/eventbus/gen/a, name:<init>, desc:(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V visitMethodInsn, opcode:INVOKEVIRTUAL, owner:com/a/a/c/d, name:a, desc:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V visitLabel, label:L1421795058 visitLineNumber, line:33, start label:33 visitLdcInsn, cst:Lcom/sample/app/MainActivity$a; visitVarInsn, opcode:ASTORE,var:4 visitLabel, label:L1555009629 visitLineNumber, line:34, start label:34 visitLdcInsn, cst:Lcom/a/a/d/a; visitVarInsn, opcode:ASTORE,var:5 visitLabel, label:L41359092 visitLineNumber, line:35, start label:35 visitLdcInsn, cst:showMessagedd visitVarInsn, opcode:ASTORE,var:6 visitLabel, label:L149928006 visitLineNumber, line:36, start label:36 visitVarInsn, opcode:ALOAD,var:2 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitTypeInsn, opcode:NEW, type:com/eventbus/gen/b visitInsn, opcode:DUP visitVarInsn, opcode:ALOAD,var:0 visitVarInsn, opcode:ALOAD,var:1 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitMethodInsn, opcode:INVOKESPECIAL, owner:com/eventbus/gen/b, name:<init>, desc:(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V visitMethodInsn, opcode:INVOKEVIRTUAL, owner:com/a/a/c/d, name:a, desc:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V visitLabel, label:L713338599 visitLineNumber, line:42, start label:42 visitVarInsn, opcode:ALOAD,var:2 visitInsn, opcode:ARETURN visitLabel, label:L681842940 visitLineNumber, line:44, start label:44 visitVarInsn, opcode:ALOAD,var:3 visitLdcInsn, cst:Lcom/sample/app/Main2Activity; visitJumpInsn, opcode:IF_ACMPNE, label:L168423058 visitLabel, label:L821270929 visitLineNumber, line:45, start label:45 visitLdcInsn, cst:Lcom/sample/app/MainActivity$a; visitVarInsn, opcode:ASTORE,var:4 visitLabel, label:L1160460865 visitLineNumber, line:46, start label:46 visitLdcInsn, cst:Lcom/a/a/d/a; visitVarInsn, opcode:ASTORE,var:5 visitLabel, label:L1247233941 visitLineNumber, line:47, start label:47 visitLdcInsn, cst:showMessage visitVarInsn, opcode:ASTORE,var:6 visitLabel, label:L258952499 visitLineNumber, line:48, start label:48 visitVarInsn, opcode:ALOAD,var:2 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitTypeInsn, opcode:NEW, type:com/eventbus/gen/c visitInsn, opcode:DUP visitVarInsn, opcode:ALOAD,var:0 visitVarInsn, opcode:ALOAD,var:1 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitMethodInsn, opcode:INVOKESPECIAL, owner:com/eventbus/gen/c, name:<init>, desc:(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V visitMethodInsn, opcode:INVOKEVIRTUAL, owner:com/a/a/c/d, name:a, desc:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V visitLabel, label:L603742814 visitLineNumber, line:54, start label:54 visitLdcInsn, cst:Lcom/sample/app/MainActivity$a; visitVarInsn, opcode:ASTORE,var:4 visitLabel, label:L1067040082 visitLineNumber, line:55, start label:55 visitLdcInsn, cst:Lcom/a/a/d/a; visitVarInsn, opcode:ASTORE,var:5 visitLabel, label:L1325547227 visitLineNumber, line:56, start label:56 visitLdcInsn, cst:showMessagedd visitVarInsn, opcode:ASTORE,var:6 visitLabel, label:L980546781 visitLineNumber, line:57, start label:57 visitVarInsn, opcode:ALOAD,var:2 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitTypeInsn, opcode:NEW, type:com/eventbus/gen/d visitInsn, opcode:DUP visitVarInsn, opcode:ALOAD,var:0 visitVarInsn, opcode:ALOAD,var:1 visitVarInsn, opcode:ALOAD,var:6 visitVarInsn, opcode:ALOAD,var:4 visitVarInsn, opcode:ALOAD,var:5 visitMethodInsn, opcode:INVOKESPECIAL, owner:com/eventbus/gen/d, name:<init>, desc:(Lcom/eventbus/gen/BusIndex;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;)V visitMethodInsn, opcode:INVOKEVIRTUAL, owner:com/a/a/c/d, name:a, desc:(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/a/a/b/a;)V visitLabel, label:L2061475679 visitLineNumber, line:63, start label:63 visitVarInsn, opcode:ALOAD,var:2 visitInsn, opcode:ARETURN visitLabel, label:L168423058 visitLineNumber, line:65, start label:65 visitVarInsn, opcode:ALOAD,var:2 visitInsn, opcode:ARETURN visitEnd visitor method ended. visitEnd

  • 3.6.4 从结果中可以看出visitor method begin与visitor method ended之间输出的就是generateSubscribeMethodIndex的具体信息

3.7 同理如果要读取字段,枚举,变量等的具体信息在相应的方法中返回自定义的visitor即可

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

ASM读取class信息 - HelloWorld