Java:asm读取class信息

 时间:2026-02-16 07:59:25

1、使用jdk提供的javap命令

Java:asm读取class信息

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

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

3、使用反编译工具Luyten

1.用luyten打开main.jar

2.选项Settings/Bytecode

3.在Structure中选中BusIndex.class

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

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

2、读取BusIndex.class基本信息

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

3、获取类名:

classReader.getClassName()

4、获取父类:

classReader.getSuperName()

5、获取接口:

classReader.getInterfaces()

6、打印信息:

Java:asm读取class信息

7、输出结果:

Java:asm读取class信息

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

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

Java:asm读取class信息

9

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

10、查看遍历结果:

Java:asm读取class信息

11、从输入结果中可以看出:

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:, desc:()V, signature:null, exceptions:null visitMethod, 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。

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

13、在ClassVisitor的visitMethod方法中使用SimpleMethodVisitor获取generateSubscribeMethodIndex方法的具体信息

Java:asm读取class信息

14、输出结果:

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

Java:asm读取class信息

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

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

  • 详细教你做小麦胚芽面包
  • Django后台怎么部署
  • 如何挑选吸油烟机
  • LK-5型光谱仪使用说明书
  • 胜利者迷你音响UX-QD9型使用说明书:[2]
  • 热门搜索
    表带长了怎么办 360如何赚钱 pvc地板怎么样 bg是什么意思 如何管理供应商 如何去除双面胶 如何查看qq特别关心我的人 梦见牙掉了是什么意思 eva是什么材质 怎么自己剪空气刘海