BaiFan
文章目录
  1. 1. 1.2 概览
    1. 1.1. 1.2.1 范围
    2. 1.2. 1.2.2 模型
    3. 1.3. 1.2.3 架构

ASM的简单介绍-概览。

1.2 概览

1.2.1 范围

ASM的作用是生成、转换和分析已经编译的Java类(Java字节码),将其替换成byte数组
(因此转换后的Java类可以被存放在硬盘上或者加载到JVM中)。为了提供一套读取、写入和转换这些byte数组的工具,
ASM使用了更高级的概念,比如常量、字符串、Java标识符、Java类型、Java类的结构元素等。
需要注意的是ASM库的范围严格的限制在读取、写入、转换和分析Java类。
特别要注意的是类加载过程是不在该范围内的。

1.2.2 模型

ASM库提供了两套API生成和转换编译后的Java类:core API提供了基于事件(Event Based)的展示方式;
tree API提供了基于对象(Object Based)的展现方式。

基于event的模型通过一系列的event来描述一个类,每一个event都代表类的一个元素,比如类的头部、一个属性、
一个方法声名、一条指令等。
基于event的模型定义了一组可能发生的event,以及这些event发生的顺序,同时提供了一个类分析器为类的每一个元素生成对应的event。

基于object的模型通过一个树形的object来一个类,每一个object都表示类的一个部分,比如class自身、一个属性、一个方法、
一条指令等。而且每一个object都包含了对其构成元素的引用。
基于object模型的API可以将一系列的event序列转换成树形对象,反之亦然,也可以将树形对象转换成一系列的event序列。

这两种API可以类比成访问XML的两种方式,SAX(Simple API for XML:用于处理XML事件驱动的推模型)和DOM(Document Object Model:文档对象模型):
基于event的模型和SAX相似,基于object的模型和DOM相似。
基于object的模型是建立在基于event模型的基础之上的,就像DOM可以基于SAX建立。

ASM同时提供两套API,是由于没有最优的API。没一套API都有它的优点和缺点:

  • 基于event模型的API比基于object模型的API速度更快、需要更少的内存,因为不需要在内存中创建和保存一系列的树形对象。
    (该不同在SAX和DOM中也存在)
  • 基于event模型的API比基于object模型的API在类转换上更难实现,因为基于event模型的API每次只能访问类的一个元素
    (这个元素就是当前的event),而基于object模型的API整个类的都在内存中,可以随时访问。

需要注意的是这两套API每次分别只能管理一个类:类层次的信息是不会被保持的,如果一个类的转换影响到了其他类,
其他类是否变更取决于用户。

1.2.3 架构

ASM库有一个非常强大的架构设计。
事实上,基于event的API是由event生产者(class解析器)、event消费者(class输出器)和各种预先定义的event过滤器组成的,
用户可以添加自定义的生产者、消费者和过滤器。
使用这些API分为两个步骤:

  1. 将event生产者、消费者、过去器组装成一个看似复杂的结构。
  2. 开启event生产者运行生成class和转换class的进程。

基于object的API也有一个强大的架构设计。
class生成器和转换器可以组装在object树上,它们之间的链接代表了它们的调用顺序。

尽管典型ASM的大部分组件都相当简单,但是也可能设想出如下图所示的复杂结构。
箭头代表了class解析器、输出器和转换器之间的交互,类的转换可能出现在任意一条链路中。
调用链

文章目录
  1. 1. 1.2 概览
    1. 1.1. 1.2.1 范围
    2. 1.2. 1.2.2 模型
    3. 1.3. 1.2.3 架构