Java:asm读取class信息
java asm框架基本使用示例
工具/原料
asm
jdk
android studio
代码地址:https://git.oschina.net/jackyanngo/ASMSample.git
class文件查看方式
1、使用jdk提供的javap命令
2、使用javap命令查看项目中main.jar中的BusIndex.classjavap -v -cp ./main.jar com.eventbus.gen.BusIndex
3、使用反编译工具Luyten1.用luyten打开main.jar2.选项Settings/Bytecode3.在Structure中选中BusIndex.class
asm中使用ClassReader读取.class信息
1、ClassReader提供四个构造方法用来加载classpublic ClassReader(final byte[] b)public C造婷用痃lassReader(final InputStream is)public ClassReader(final String name)public ClassReader(final byte[] b, final int off, final int len)
2、读取BusIndex.class基本信息ClassRea蟠校盯昂der classReader = new ClassReader(BusIndex.class.getName());
3、获取类名:classReader.getClassName()
4、获取父类:classReader.getSuperName()
5、获取接口:classReader.getInterfaces()
6、打印信息:
7、输出结果:
8、使用ClassVisitor读取BusIndex.class详细信息ClassReader提供了 accept方法可以遍历class的具体信息,该方法有两个重载
10、查看遍历结果:
11、从输入结果中可以看出:vers坡纠课柩ion:version:51 与反编译结果一致flags:access:49 与反编译结果一致Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_SUPER = 49InnerClasses:visitInnerClass, name:com/eventbus/gen/d, outerName:null, innerName:null, access:0visitInnerClass, name:com/eventbus/gen/c, outerName:null, innerName:null, access:0visitInnerClass, name:com/eventbus/gen/b, outerName:null, innerName:null, access:0visitInnerClass, name:com/eventbus/gen/a, outerName:null, innerName:null, access:0visitInnerClass, name:com/sample/app/MainActivity$a, outerName:com/sample/app/MainActivity, innerName:a, access:9method:visitMethod, access:1, name:, desc:()V, signature:null, exceptions:nullvisitMethod, access:1, name:generateSubscribeMethodIndex, desc:(Ljava/lang/Object;)Lcom/a/a/c/d;, signature:null, exceptions:null
12、使用MethodVisitor读取BusIndex.class中方法的详细信息ClassVisitor的visitMethod只能获取方法的基本信息,如果要获取方法的详细信息就必须在visitMethod返回一个自定义的MethodVisitor。
13、在ClassVisitor的visitMethod方法中使用SimpleMethodVisitor获取generateSubscribeMethodIndex方法的具体信息
14、输出结果:
15、从结果中可以看出visitor method begin与visitor method ended之间输出的就是generateSubscribeMethodIndex的具体信息
16、同理如果要读取字段,枚举,变量等的具体信息在相应的方法中返回自定义的visitor即可