ASM的简单介绍-概览。
ASM的作用是生成、转换和分析已经编译的Java类(Java字节码),将其替换成byte数组 (因此转换后的Java类可以被存放在硬盘上或者加载到JVM中)。为了提供一套读取、写入和转换这些byte数组的工具, ASM使用了更高级的概念,比如常量、字符串、Java标识符、Java类型、Java类的结构元素等。 需要注意的是ASM库的范围严格的限制在读取、写入、转换和分析Java类。 特别要注意的是类加载过程是不在该范围内的。
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都有它的优点和缺点:
需要注意的是这两套API每次分别只能管理一个类:类层次的信息是不会被保持的,如果一个类的转换影响到了其他类, 其他类是否变更取决于用户。
ASM库有一个非常强大的架构设计。 事实上,基于event的API是由event生产者(class解析器)、event消费者(class输出器)和各种预先定义的event过滤器组成的, 用户可以添加自定义的生产者、消费者和过滤器。 使用这些API分为两个步骤:
基于object的API也有一个强大的架构设计。 class生成器和转换器可以组装在object树上,它们之间的链接代表了它们的调用顺序。
尽管典型ASM的大部分组件都相当简单,但是也可能设想出如下图所示的复杂结构。 箭头代表了class解析器、输出器和转换器之间的交互,类的转换可能出现在任意一条链路中。