ASM分析系列之一: 简介

目录

一、背景

程序分析、生成和转换在许多场景下得到了广泛的使用

  1. 程序分析,从简单的语法分析到完整的语义分析,可以用来在应用程序中发现潜在的bug,检测无用代码,逆向工程代码,等等。

  2. 程序生成在编译器中使用。包括传统的编译器,但也有用于分布式程序的存根或骨架编译器,仅在时间编译器中使用,等等。

  3. 程序转换可用于优化或修改程序、将调试或性能监视代码插入应用程序、面向方面的编程等。

    这些技术被用于很多编程语言中,但是它的难易程度也取决于语言。在Java语言中可以用于Java源码或是编译后的Java 类文件classes。处理编译后的类文件的一个优点在于,不需要源码。程序转换可以用于任何应用程序,包括封闭源代码和商业应用程序。另外一个处理编译后代码的有点在于,更容易在类文件加载到Java虚拟机之前运行时分析、生成以及转换类文件(运行是生成和编译源码也是可以的,但是效率很慢并且需要一个完整的Java编译器)。其优点是,stub编译器或aspect weavers之类的工具对用户变得透明。

    得益于程序分析。生成和转换技术的广泛使用,很多用于分析生成和转换代码的工具已经被实现先了,适用于多种编程语言,包括Java。ASM是其中一个针对Java语言的运行时和线下类生成和转换工具。ASM类库被设计工作在编译后的Java类文件中。同时,它也被设计的尽可能的快和轻量。尽可能的块对于运行期间使用ASM的应用来说很重要,旨在不要减低运行效率。并且尽可能地小对于在内存受限的环境中使用非常重要,并且避免使用ASM来膨胀小型应用程序或库的大小。

    ASM不是唯一一个用来生成和转换编译后Java类文件的工具,但它是最新的、最有效的方法之一。它的主要优势如下:

  1. 简单、设计良好、模块化的API,易于使用。

  2. 它有很好的文档,并且有一个相关的Eclipse插件。

  3. 支持最新版Java, Java 7

  4. 轻量级,快速,鲁棒性

  5. 庞大的用户社区可以为新用户提供支持。

  6. 它的开放源码许可允许您以任何您想要的方式使用它。

     

二、概述

2.1 功能边界

    ASM library的目的是生成、转换和分析编译后的Java类文件,以byte数组的形式展示(存储在磁盘上并且被JVM加载)。从这个目的触发,ASM通过使用比字节更高级别的概念来读取、写入和转换这些字节数组,例如,数字常量、字符串、Java标识符、Java类型、Java类结构元素等等。注意,ASM库的范围仅限于阅读、编写、转换和分析类。类加载过程超出了范围。

 

2.2 模型

    ASM library提供了两个API来生成和转换编译后类文件:core API提供基于事件的类表示,而tree API提供基于对象的表示。

    在基于事件的模型中,一个类用一系列事件表示,每个事件表示类的一个元素,例如它的头、字段、方法声明、指令等等。基于事件的API定义了一组可能的事件和它们必须发生的顺序,并提供了一个类解析器,该解析器为每个被解析的元素生成一个事件,以及一个类写入器,该类写入器从这些事件的序列生成编译的类。

    使用基于对象的模型,类用对象树表示,每个对象表示类的一部分,如类本身、字段、方法、指令等,每个对象都引用表示其组成部分的对象。基于对象的API提供了一种方法,可以将表示类的事件序列转换为表示相同类的对象树,反之亦然,可以将对象树转换为等效的事件序列。换句话说,基于对象的API构建在基于事件的API之上。

    这两个API可以与XML (SAX)的简单API和XML文档的文档对象模型(DOM) API进行比较:基于事件的API类似于SAX,而基于对象的API类似于DOM。基于对象的API构建在基于事件的API之上,就像DOM可以在SAX之上提供一样。

    ASM同时提供两种API是因为它们各有所长,每种API都有它自身的优势和缺点:

· 基于事件的API和基于对象API相比,更快,并且需要更少的内存。因为它们不需要再内存中创建用于表示类和对象的数(SAX和DOM同理)

· 然而实现类转换功能在基于事件的API上更为困难,因为类中只有一个元素在给定的时间(对应于当前事件的元素)可用,而在基于对象的API中整个类在内存中都是可用的。

    注意这两个API每次只会处理一个类,并且它们是互相独立的:类的层次结构不会被维护。并且如果一个类的改变影响了其他类,需要用户来对其他类进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值