ASM Core(1) 初探


[asm4-guide](http://download.forge.objectweb.org/asm/asm4-guide.pdf)学习心得

ASM是一种小巧轻便的 Java 字节码操控框架,它能方便地生成和改造 Java 代码

ASM通过ClassVisitor来生成和转换class字节码. ClassVisitor中的每个方法都对应着class数据结构, 你可以通过每个方法名轻松的判断出这个方法对应的是哪个数据结构.

ClassVisitor内的方法调用顺序如下:

  1. visit : 调用visit方法(有且仅有调用一次)
  2. visitSource? : 调用visitSource函数(最多调用一次)
  3. visitOuterClass? : 调用visitOuterClass函数(最多调用一次)
  4. ( visitAnnotation | visitAttribute )* : 调用visitAnnotationvisitAttribute函数, 这俩个函数的调用可调用任意次且不分前后顺序
  5. ( visitInnerClass | visitField | visitMethod )* : 调用visitInnerClass,visitFieldvisitMethod函数, 同样对这三个函数的调用不限制次数以及不分前后顺序
  6. visitEnd : 调用visitEnd函数(有且仅有调用一次),调用这个函数用于结束整个过程.

ASM通过基于ClassVisitor的三个API来生成和转换class字节码

  • ClassReader: 用于解析一个给定的class二进制字节数组, 然后按照上文介绍的顺序依次调用accept()ClassVisitor参数的方法.
  • ClassWriter : 一个ClassVisitor的子类, 用于直接生成二进制的字节码.
  • ClassVisitor : 代理了全部的字节码相关的方法调用. 它接收另一个ClassVisitor对象形成责任链模式调用.

我们通过ClassReader来解析一个二进制的class结构数据, 然后ClassReader按照一定的顺序调用ClassVisitor 来改变class结构数据, 最后通过ClassVisitor生成新的class二进制数据.