ASM
https://blog.csdn.net/lijingyao8206/article/details/46430403
https://blog.csdn.net/lijingyao8206/article/details/46483815
https://blog.csdn.net/lijingyao8206/article/details/46715409
ASM是一个提供字节码解析和操作的框架。可以用于解析和生成字节码。
解析
要解析的类
1 | public class Programmer { |
ClassPrintVisitor 类继承自ClassVisitor类来打印解析类的类名,父类名以及“is”开头的属性和方法。
1 | public class ClassPrintVisitor extends ClassVisitor { |
下面是测试类ClassesPrintTest 。将一个ClassPrintVisitor 对象传给ClassReader。ClassReader作为一个解析事件的producer 并且由ClassPrintVisitor去消费(处理打印逻辑)。accept()方法就将Task 字节码进行解析,然后调用ClassPrintVisitor 的方法。
1 | public static void visit() throws Exception { |
运行结果:
1 | com/zero/jdk_cglib/asm/Programmer extends java/lang/Object { |
生成
1 | public class AsmGenerator { |
ASM的Core API 中给我们提供了一些工具类,都在 org.objectweb.asm.util包中。有TraceClassVisitor、CheckClassAdapter、ASMifier、Type等。通过这些工具类,能更方便实现我们的动态生成字节码逻辑。这里就简述一下TraceClassVisitor 。
TraceClassVisitor 顾名思义,我们可以“trace”也就是打印一些信息,这些信息就是ClassWriter 提供给我们的byte字节数组。因为我们阅读一个二进制字节流还是比较难以理解和解析一个类文件的结构。TraceClassVisitor通过初始化一个classWriter 和一个Printer对象,来实现打印我们需要的字节流信息。通过TraceClassVisitor 我们能更好地比较两个类文件,更轻松得分析class的数据结构。
下面看个例子,我们用TraceClassVisitor 来打印Task 类信息。