Copyright c 2007, Eric Bruneton All rights reserved.
ASM 一个Java字节码引擎库
1. 介绍
1.1 动机
程序的分析、生成、转换通常是一种非常重要的技术:
>程序分析(包括小到语法分析,大到全部的语义分析),可以用于发现程序中潜在的bug、检测其中的无用代码等。
>程序生成,用于编译器中。既包括传统的编译器,也包括用于开发的编译器框架、即时编译器等。
>程序转换,可以用于优化或混淆程序,在面向切面编程中,可以用于向程序中插入调试或监控代码。
所有这些技术可以体现在任何一种语言中,根据语言的不同,这些技术的实现也有难有易。在Java中,这些技术可以用在源代码或编译过的.class文件上。
ASM是专门用于Java的程序分析、生成、转换工具。ASM的下载地址:http://asm.objectweb.org 。
ASM的优点如下:
>简单、设计优秀、模块的API,使它非常易于使用。
>有完备的文档,还有配备了一个Eclipse插件辅助开发
>支持Java6
>小巧、快速、健壮
>有较大的用户社区,新手可以从中获取帮助
>开源
1.2 概览
1.2.1 适用范围
ASM库的目标是生成、转换和分析Java class。ASM提供了用于读写转换Java字节码数组的工具,这些工具使用更高级的概念对Java字节码进行操作,比如数字常量、字字符串、Java标识符、Java类型、Java类结构元素等。
ASM库只用于分析、生成、转换Java字节码。类加载等操作,ASM库中并不提供。
注:ASM没有实际含义,它不是某些英文单词的缩写。
1.2.2 模型
ASM提供了两套用于生成和转换已编译Java类的API。
Core API 提供了基于事件的表现形式。
Tree API 提供了基于对象的表现形式。
在基于事件的模型中,Java类表现为一个事件的序列,序列中的每一个事件表示了类中的一个元素,比如头部、字段、方法声明、指令等。
在基于对象的模型中,Java类表现为一个对象树。树中的每个对象表示里类中的一个元素,比如类本身、字段、方法等。
基于对象模型的API构建于基于事件的API之上。
如果你对XML比较熟悉的话,那么实际上可以把 ASM Core API 比作 XML SAX,而 ASM Tree API 则可以看做是 XML DOM。
1.2.3 架构
这里的描述比较晦涩难懂,暂时略过。
1.2.4 代码组织
>org.objectweb.asm
>org.objectweb.asm.signature
上面2个包中定义了基于事件模型的API,提供了Java类的parser和writer。这2个包存在于asm.jar中。
>org.objectweb.asm.util
存在于asm-util.jar中,用于对core API进行调试。
>org.objectweb.asm.commons
包含了一些预定义的类转换器(多数基于core API),位于asm-commons.jar中。
>org.objectweb.asm.tree
在asm-tree.jar中。定义了基于对象模型的API。
>org.objectweb.asm.tree.analysis
位于asm-analysis.jar中,提供了一个类分析框架和一些基于时间模型API的预定义类分析器。
jar包分类:
>基于事件模型:asm.jar、asm-util.jar、asm-commons.jar
>基于对象模型:asm-tree.jar、asm-analysis.jar