标签(空格分隔): asm 类
#####类 编译过后的class结构:
#####源文件与类文件的不同#####
#####overall structure of a compiled class
Modifier,name,super class,interfaces |
---|
Constant pool:numeric,string,type constant |
source file name |
Enclosing class reference |
Annotation* |
Attribute* |
Inner Class |
Field* |
Method* |
#####内部名称
|java tyle | Type descriptor| | ----- | |boolean | Z| |char | C| |byte|B| |short|S| |int|I| |float|F| |long|J| |double|D| |Object|Ljava/lang/Object;| |int[]|[I|
在类中类型的表示更加简洁,而且源文件中的点转换为了斜杠 引用类型的L代表哪个单词?
#####解析类
解析类使用到唯一类就是 ClassReader
#####Execution Model
java代码在thread中执行,每一个线程都有自己都执行栈,由frame(帧)组成,每一帧都代表一个方法调用,每次方法调用时,新的帧就被压入当前线程的栈中,方法返回时,无论说正常返回还是由于异常抛出,这一帧都会被弹出执行栈
底下的关于method的涉及到指令,没有很看明白,各种指令交织,需要对汇编了解一点,不过对方法的底层实现倒是有了一点了解
ClassReader=>start: ClassReader
ClassVisitor=>operation: ClassVisitor
ClassVisitor2=>operation: ClassVisitor
ClassWriter=>end: ClassWriter
ClassReader->ClassVisitor->ClassVisitor2->ClassWriter
ClassReader->ClassVisitor: visit[Source,Method...]
ClassVisitor->ClassWriter: visit[Source,Method...]
ClassWriter->ClassVisitor: return value(void,MethodVisitor..);
ClassVisitor->ClassReader: return value(void,MethodVisitor..);
Asm的通过拦截链解析Class实现的很优雅,自己想要干预其中的某项生成,都可以很简单的实现相应的Visitor,把Visitor放入解析链中即可。理解ClassVisitor中的方法是什么难度,毕竟平时使用的就是注解,属性,方法等,但是MethodVisitor涉及到底层class的汇编代码,理解起来比较困难,可以选择先去学习下汇编相关知识以及jvm规范