专栏首页光变1.2 ASM-简介-概览

1.2 ASM-简介-概览

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你所不知道的Java之Switch

    ??? Enum,String,Character,Byte,Short,Integer

    白凡
  • 2.1 ASM-类-结构

    本章介绍了使用ASM core的API,生成编译后的class和转换编译后的class。 首先展示了编译后的class文件,然后介绍相应的ASM接口、组件和工具...

    白凡
  • 2.3 ASM-类-工具类

    除了ClassVisitor类,以及相关的ClassReader和ClassWriter等组件, ASM在org.objectweb.asm.util还提供了一...

    白凡
  • 推荐系统技术连载(1)

    在这个系列文章中,我将分享掌握推荐系统的经验,以及围绕推荐系统从低级模型到高级模型的实现。

    刘盼
  • 【玩转腾讯云】SCF中php的一些入门坑

    由于SCF本身是用bootstrap.php来调用我们的入口函数,默认为index.main_handler,意思是调用index.php文件中的main_ha...

    逸笙1
  • 我是怎么走上推荐系统这条(不归)路的……

    在这个系列文章中,我将分享掌握推荐系统的经验,以及围绕推荐系统从低级模型到高级模型的实现。

    机器之心
  • 事务可重复读采坑

    老梁
  • 资源 | 从人脸检测到语义分割,OpenCV预训练模型库

    项目地址:https://github.com/opencv/open_model_zoo

    机器之心
  • TIANCHI天池-OGeek算法挑战赛分享及完整代码(亚军)

    首先很幸运拿到本次大赛的亚军,同时非常感谢大佬队友的带飞,同时希望我的分享与总结能给大家带来些许帮助,并且一起交流学习。

    机器学习理论与数据竞赛实战
  • CTF---密码学入门第七题 杯酒人生

    杯酒人生分值:10 来源: Veneno 难度:易 参与人数:2633人 Get Flag:790人 答题人数:963人 解题通过率:82% 使用古典密码 ...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动