【Java笔记——术】ASM 反射库介绍

翻译于 ASM Guide http://asm.ow2.io/

介绍

ASM 是基于class 字节码技术的反射库。

其适用于读、写,转换和分析类。 不可于类实例化。

ASM 库提供两种API 生成转化已编译的class文件。:

  • core API 基于 event 表示 class。
    基于 event 模式 class将被表示为一个events序列,每一个event都代表了class中的一个元素,例如header, filed, 方法声明, 方法调用等等。基于event 的API 定义了一个可能发生的events集合 以及它们发生的顺序,并且提供了一个 类解析器在解析类的每一个元素时生成一个 event,以及一个类编写器(class writer)生成完整类对应的event序列。
  • tree API 基于 object 表示 class
    基于 object 模式 class将被表示成一个对象树,每一个object代表着class的一部分,例如class自己,属性,方法,结构等等。每一个object都包含对于组成 自身object的引用。基于object的API提供将以events序列表示的class转换为以对象树表示的class,反之,对象树转换events序列。换言之,基于object的API是基于event API 的上层API。

这两种 API 可以与 Simple API for XML (SAX) 和 Doucument Object Model(DOM) APIs for XML documents 相比较。基于event API 更类似与SAX, 基于object 的 API 更类似于 DOM。基于object API 是基于event API 的上层API,就像DOM可以作为SAX的上层。

ASM 提供两种API 是因为它们之间没有哪个更好,而是不同的API有自己自己的优势与劣势:
- 基于event API 更快并且对于内存的占用更小,因为它不需要在内存中创建,管理一个和class对应的对象树
- 实现一个类的转换对于 基于event 的 API 来说更难,因为在class中同一时间只能有一种元素可用,而基于object API在内存中整个class都可用

注意两种API同时管理同一个class是相互独立的。如果转换影响到其他类,则由用户决定是否修改它们的其他类。

架构

ASM 有清晰的层次架构。

基于event API

基于event API 结构 围绕 event 生产者(class解析器), event 消费者(class编写器)和各种预定义的event过滤器,用户都可以自定义生产者,消费者和过滤器加入到其中。使用该API因此包含两步:
- 可以通过组合 event生产者,过滤器和event消费者 构建复杂的结构
- 然后启动 event生产者 生成或转化 进程

基于object API

基于object API 同样具有清晰的层次架构, class生成或转化组件生成一个可以组合的对象树,它们之间的连接代表转换的顺序。

虽然大多数 ASM 组件架构比较简单,但它可以组合出复杂的架构就像下图。箭头表示类之间基于event或基于object的通信 解析器,编写器或转换器之间的通信,并在 基于event 和基于object 之前的转化可能发生于下图链中的任何地方。

包结构

org.objectweb.asm & org.objectweb.asm.aignature

定义基于object的API ,提供 class 解析器和编写器组件。 asm.jar

org.objectweb.asm.util

为core API 提供多种工具类,用于开发和debug ASM应用。 asm-util.jar

org.objectweb.asm.commons

提供多种重要的预定义类解析器,大多数基于 core API。 asm-commons.jar

org.objectweb.asm.tree

提供基于 object API,提供工具转换基于object和基于 event API。 asm-tree.jar

org.objetweb.asm.tree.analysis

提供class分析框架和一些预定义的class分析器,基于 tree API。 asm-analysis.jar

猜你喜欢

转载自blog.csdn.net/wang135139/article/details/80559660