第一章:ASM介绍

1.1 ASM动机:

程序的分析,生成,转换技术可以应用到许多场景:

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

2.代码生成应用在各种编译器中:既包括传统的编译器也包括分布式编程的stub或者skeleton编译器,即时编译器等等。

3. 代码转换,可用于优化或混淆程序,向应用中插入测试或性能监控程序,面向切面编程等等。

这些技术可以用在任何编程语言,但或多或少容易依赖语言。在java 语言中,它们可以应用在源码中也可以应用在编译后的class文件中。用在编译后的class文件中的好处之一是:显然,不需要源代码。代码转换可以应用到任意的应用,包括源码封闭的应用和商业应用中。另外一个应用到编译后的代码是:可以在运行时期(即在类被加载到java虚拟机之前)来分析,产生,转换类。java虚拟机用来在运行时期产生、编译源代码,但它比较慢并且要求有一个完整的java编译器。好处是:对用户来说,这类工具例如stub编译器或者切面编织器是透明的。

由于程序分析,产生和转换技术有如此多种用途,很多种语言包含java的分析、生成和转换的工具已经被开发出来了。ASM就是一种专为java语言设计的在运行时期(不是离线)的类产生、转换的工具。因此ASM库专为编译后的java类文件。它设计的尽可能的运行快,占用空间少。尽可能的快是为了尽可能不影响在运行期使用ASM应用的速度;尽可能的小是为了用在内存资源受到严格限制的环境避免因为使用ASM而造成小应用或者库的空间膨胀。

ASM不仅仅是一个产生、转换编译后的java类的工具,它同时也是一种最现代最有效率的工具。可以从http://asm.objectweb.org下载到ASM. ASM的主要特点有以下几点:

1. 它有一个简单易用的、完美设计的、模块化的API.

2. 它文档完善并有一个Eclipse关联的插件。

3. 它提供对java 最新版本java 7的支持。

4. 体积小,速度快,健壮性好。

5. 对新用户提供庞大的社区支持。

6. 开源,允许你任意使用。

1.2 ASM 概述

1. 域

  ASM库的目标是为了产生、转换、分析编译后的JAVA 类(表现为字节数组,因为它们存储在磁盘上然后被加载到java 虚拟机中)。正因为有此目标,ASM提供了对这些字节数组读写和转换的工具,这些工具使用比字节更高级别的抽象如数字常量,字符串,java标识符,java 类型,java类结构元素等进行读写和转换。注意:ASM库的域被严格限定在对类的读写,转换和分析。特别是类的加载时超过这个域的。

2. 模型

ASM库提供两种类型的API来产生,转换编译后的类:核心API提供基于事件的类的展现;树API提供了一个基于对象的展现。

基于事件的模型中,一个类表现为一个事件序列,每个时间代表了类的一个元素,例如header、field、method声明、一条指令等。基于事件的API定义了的一组可能事件和必须发生的顺序,并提供了一个类解析器:它根据它解析的每一个元素产生一个事件;一个写入器:从事件序列中产生编译后的类。

基于对象的模型中,一个类表现为一个对象树,每个对象代码了类的一部分,例如:类本身,一个field,一个方法,一条指令等。每个对象具有代表其组成的对象引用。基于对象的API提供了将代表一个类的事件序列转换成代表同一个类的对象树的方法,反之亦然,将一个对象树转换为等同的事件序列。换句话说,基于对象的API 建立在基于事件的API之上。这个两个API的对比可以形容为:SAX(xml简单api)和DOM(文档对象模型),其中基于事件的API类似于SAX,基于对象的API类似于DOM。基于对象的API建立在基于事件的API之上,正如DOM建立在SAX上一样。

ASM提供了这两种API,因为没有一种API 能比另外一种API更好。事实上,每个API都有自己的优缺点:

1、基于事件的API比基于对象的API的速度更快,需要的空间更少。因为不需要再内存中创建和存储一个代表类的对象树(同样的情况也存在于SAX和DOM之间)。

2、 基于事件的API更难于实现类的转换,因为在任意时间只能访问到类的一个元素(对应当前时间的元素),而基于对象的API都可以在内存中访问到。

注意:两种API只能在一个事件管理一个类,并且各自独立。类的继承信息没有保存,若一个类的转换影响到别的类,必须由用户去修改那些类。

3. 架构:

ASM 应用有很强的架构视图。事实上,基于事件的API围绕事件生成者(类解析器)、事件消费者(类写入器)和各种预定义的过滤器进行组织,用户定义的生产者、消费者和各种过滤器可以很容易添加上去。因而使用此API需要两步:

1、将事件的生产者、过滤器、消费者组件汇编成复杂的架构。

2、然后运行事件生产者来运行产生或者转换进程。

基于对象的API同样有一个架构视图:由操作对象树的类产生器和转换器组件构成,两者的连接表示转换的顺序。

尽管大部分组件架构特别是ASM应用是非常简单的,但也能够联想到复杂的架构,如下:

箭头代表类解析器、写入器、转换器之间基于事件或者基于对象的连接,在链型结构中到处存在基于事件或者对象的转换。

1.3 组织结构:

ASM库有几个不同的包组成,它们被放入到不同的jar文件中:

包org.objectweb.asm 和org.objectweb.asm.signature定义了基于事件的API,并且提供了类解析器和写入器组件,它们被打入到asm.jar文件中。

包org.objectweb.asm.util,被打入到asm-util.jar文件中,提供了许多基于核心API的工具,这些工具可以用在ASM应用的开发和调试当中。

包org.objectweb.asm.commons提供了一些有用的预定义类转换器,大部分基于核心API。它被打包到asm-commons.jar。

包org.objectweb.asm.tree,打包到asm-tree.jar文件中,定义了基于对象的API,提供了基于事件和基于对象的表现形式的转换工具。

包org.objectweb.asm.tree.analysis提供了基于树API的一个类分析框架和一些类分析器,打包到asm-analysis.jar文件。

该文档包含两个部分,第一部分介绍了核心API,例如:asm,asm-util和asm-commons文件。第二部分介绍了树API,例如:asm-tree和asm-analysis文件。每部分至少有一章介绍关联类的API,一章关联方法的API,一章关联注解、通用类型等的API。每章包含编程接口和相关工具及预定义组件。所有的实例源码均可在ASM官方网站下载。

这种组织形式可以更容易地逐步引入类文件的各种特征,但有时需要在部分章节中扩展单个ASM类的表现形式。因此,建议按照文档的顺序安排来读取。如果仅使用该手册文档的ASM API,请使用Javadoc

排版约定

  <略>

 致谢

  感谢François Horn。在编纂这篇文档期间,他的有价值的评论大大提高了该文档的结构和可读性。

核心API、TREE API后续中。。。。

spring core源码解读之ASM4用户手册翻译之一asm简介的更多相关文章

  1. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  2. 【转载】Spring @Async 源码解读。

    由于工作中经常需要使用到异步操作,一直在使用@Async, 今天抽空学习了一下它的执行原理,刚好看到一篇写的很棒的文章,这里转载过来做个记录,感谢原作者的无私奉献. 原文章链接地址:https://w ...

  3. spring beans 源码解读

    从把spring下下来,导入到eclipse,花了几个小时的时间. 本来壮志雄心的说要,满满深入学习研读spring源码,现在看来还是不太现实,太难懂了,各种依赖,说明都是英文,整个串起来理解,深入研 ...

  4. Spring事务源码解读

    一.Spring事务使用 1.通过maven方式引入jar包 <dependency> <groupId>com.alibaba</groupId> <art ...

  5. Spring:源码解读Spring IOC原理

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

  6. Spring IoC源码解读——谈谈bean的几种状态

    阅读Spring IoC部分源码有一段时间了,经过不断的单步调试和参阅资料,对Spring容器中bean管理有了一定的了解.这里从bean的几个状态的角度出发,研究下IoC容器. 一.原材料 Xml中 ...

  7. spring beans源码解读

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  8. Spring Security4源码解读探寻权限机制

    我们知道springSecurity 会在用户登录的时候获取用户的角色权限, 你是一个普通用户可能没有管理员拥有的权限.用户登录后Authentication 获取用户的权限. 不通用户登录系统会生成 ...

  9. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

随机推荐

  1. webserver<2>

    #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wai ...

  2. 【技术贴】解决 myeclipse打不开报错an error has occurred, see .

    方法1.右键选中快捷方式属性选项,在快捷方式页,目标一项最后加上-clean选项,如C:\MyEclipse6\eclipse.exe -clean. 然后重新启动一下MyEclipse. 方法2. ...

  3. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  4. Android开源项目发现---ActionBar篇(持续更新)

    1. ActionBarSherlock 鼎鼎大名, 为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题 项目地址:https://github.com/ ...

  5. Perl脚本学习经验(三)--Perl中ftp的使用

    使用use Net::FTP;Demo:    my $Server = '192.168.1.1';    my $User = 'admin';    my $Password = 'admin' ...

  6. ASP.NET MVC 下 引用阿里巴巴和IconFont字体路径404问题

    参考:http://stackoverflow.com/questions/28169365/font-wont-get-found-on-server-for-firefox# http://blo ...

  7. C++中new和不new的区别

    我们都知道C++中有三种创建对象的方法,如下: 复制代码代码如下: #include <iostream>using namespace std; class A{private:    ...

  8. bzoj1072

    还是那句话s<=10 必然想到状压 题目唯一的难点在于怎么转移整除 整除即是mod d=0,我们用f[cur,j]表示选取状况为cur,余数为j的方案数 注意一个数a1a2a3…an (ai表示 ...

  9. bzoj1927

    看到这道题不难想到费用流吧,但是怎么做呢? 一开始看到“每个点都恰好走一次”,我首先想到的有下界最小费用流, 然后发现这没有满足最大流的条件,然后又连边松弛掉多余的流 为了按照可行流的做法先减减去极大 ...

  10. pcDuino无显示器刷机与使用

    准备工作: pcduino : 点此购买 一个可用的并且启用了DHCP的有线路由器. 连接pcduino与路由器的网线一根. 至少1张4G microSD卡,如果内存卡不大,可以用内存卡刷内核,用u盘 ...