asm 笔记

2019-07-01 15:11:50 浏览数 (1)

asm 读书笔记

标签(空格分隔): asm 类


#####类 编译过后的class结构:

  • 一部分描述修饰符,名称,超类,接口以及其上的annotation
  • 每个field为一部分,每部分里面包含属性的修饰符,名称,类型,annotation
  • 每个方法为一部分,包含构造函数,每部分包含了修饰符,名称,返回值,参数类型以及annotation,也包含方法的实现代码

#####源文件与类文件的不同#####

  • 一个类文件只描述一个class,源文件可以包含多个,当然,源文件中的主类内部类在编译后的类文件中都会有链接指向对方
  • 类文件中不包含注释
  • 类文件中没有package和import,所有的类型名称都是全路径
  • 类文件中包含了一个常量池,是一个包含所有的数字,字符串和类型常量的数组,并且只被定义一次

#####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代表哪个单词?

  • 方法描述符 方法描述符其实就是参数类型和返回类型的类型描述符的集合在一个字符串中,其中并没有方法名称 V for void void m(int i,float f) (IF)V int sss(Object o) (Ljava/lang/Object;)I void dd() ()V

#####解析类

解析类使用到唯一类就是 ClassReader

#####Execution Model

java代码在thread中执行,每一个线程都有自己都执行栈,由frame(帧)组成,每一帧都代表一个方法调用,每次方法调用时,新的帧就被压入当前线程的栈中,方法返回时,无论说正常返回还是由于异常抛出,这一帧都会被弹出执行栈

底下的关于method的涉及到指令,没有很看明白,各种指令交织,需要对汇编了解一点,不过对方法的底层实现倒是有了一点了解

代码语言:javascript复制
ClassReader=>start: ClassReader
ClassVisitor=>operation: ClassVisitor
ClassVisitor2=>operation: ClassVisitor
ClassWriter=>end: ClassWriter

ClassReader->ClassVisitor->ClassVisitor2->ClassWriter
代码语言:javascript复制
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规范

0 人点赞