首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1.2 ASM-简介-概览

1.2 ASM-简介-概览

作者头像
白凡
发布2018-08-07 17:07:05
2780
发布2018-08-07 17:07:05
举报
文章被收录于专栏:光变光变

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解析器、输出器和转换器之间的交互,类的转换可能出现在任意一条链路中。

调用链
调用链
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.2 概览
    • 1.2.1 范围
      • 1.2.2 模型
        • 1.2.3 架构
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档