ASM是什么?

借用别人的话 :ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。

ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为(通过实现ClassFileTransformer接口)。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 与 BCEL 和 SERL 不同,ASM 提供了更为现代的编程模型。对于 ASM 来说,Java class 被描述为一棵树;使用 “Visitor” 模式遍历整个二进制结构;事件驱动的处理方式使得用户只需要关注于对其编程有意义的部分,而不必了解 Java 类文件格式的所有细节:ASM 框架提供了默认的 “response taker”处理这一切。

第一章 介绍

1.1动机

程序分析、生成和转换是非常有用的技术,它具有以下的应用场景:

l  程序分析(包括从简单的综合性分析到一个全面的语义分析)可以被用来寻找潜在的bug,发现未使用的代码,进行工程代码的逆向。

l  程序生成被用在编译器当中。这包括传统的编译器,也包括为分布式编程使用的stub或skeleton 编译器,即时编译器等

l  程序转换可以被用来优化或者混淆程序,为程序插入debugging或者性能检测代码,方便面向对象编程等。

所有这些技术可以被用到任意的编程语言,但是难易程度依赖于具体语言。对于Java来说,这些技术可以被用在Java源代码或者编译后的Java类。对于编译好的类,有一个明显的好就是不需要源代码。因此,程序转换可以被用在任何应用上,包括闭源软件以及商业软件。另一个好处是:在程序被加载之JVM之前,使得在运行时分析、产生或者转换类变为可能。这个好处使得stub编译器或者aspect weaver之类的工具对用户透明。

考虑到程序分析、产生和转化的诸多用处,许多工具已经实现了这些功能。ASM就是这些工具中的一个,它面向Java语言,为运行时(也支持脱机)类的产生和转换设计。因此,ASM的库被设计针对编译后的java类工作。ASM被尽量的设计的占用内存小以及执行速度快。此处省略两句废话。

ASM不仅仅一个可以产生和转化编译后Java类的工具同时它也是最新的和最高效的。以下省略7条优点。

1.2综述

1.2.1范围

ASM的目标是产生、转换和分析表示为字节数组的编译后的Java类,因此ASM提供工具通过使用更高层的概念来读写和转换这些字节数组,比如:数字常量、字符串、Java识别符、Java类型、Java类结构元素等。注意,ASM类库的范围严格的限制为读写、转换和分析类。类的加载过程不在这个范围内。

1.2.2模型

ASM提供两种API,第一种是core API,提供一种基于事件的类的代表,另一种是tree API,提供了一种面向对象的代表。

基于事件的模型中一个类用一系列事件代表,其中每个事件代表一个类的元素,比如说头、域、方法的声明、说明等。基于事件的API定义了可能的事件的集合以及他们发生的顺序,并且提供了一个类的分析器来为每个分析过的元素产生一个事件,就像一个类的writer为这些事件序列产生编译好的类。

基于对象的模型使用一个对象树来代表一个模型,每个对象代表类的的一部分,比如类本身,一个域,一个方法,一个说明等。每个对象都有一个到委托对象的索引。基于对象的API提供了一种将一系列事件代表的类转化为对象树代表的同一个类的方法,反之亦然。换句话说,基于对象的API是建立在基于事件的API之上的。

这两个API可以类比为XML的Simple API和DOM API,基于事件的API类似与Simple API,基于对象的API类似于DOM。

ASM提供两种API的原因是:没有最好的API,每一种API都有其优劣之处。

l  基于事件的API比较快速、相比基于对象的对内存的需求比较小,因为需要内存来创建和存储代表类的对象树。

l  基于事件的API很难实现类的转换,因为仅有一个类元素在某个给定时间可用,而基于对象的API是内存中的整个类可用。

注意:两个API在同一时刻只管理一个类,如果发生冲突,则由用户来修改。

1.2.3体系结构

ASM拥有健壮的体系结构。实际上,基于事件的API围绕事件生产者、消费者和许多事先定义的事件过滤器、用户定义的生产者、消费者和过滤器可以被添加。因此,使用这个API分为两步:

l  将事件生产者、过滤器和消费者组建组装成一个可能的复杂体系结构。

l  接着启动事件生产者来运行生成或者转换的过程。

基于对象的API也用于一个完整的体系结构:实际上,操作一棵树的类的生产或者转换组件可以进行合成,他们之间的链接代表了转换的顺序。

尽管在典型的ASM中基于组件的体系结构是非常简单的,但是我们可以想象一个复杂的体系如下图,其中箭头代表分析器、读写器或者转换器之间的基于时间或者基于对象的交流,链中表示了所有的转换可能。

1.3组织

ASM的类库被组织在不同的包中,这些包分布在许多jar包中:

l  org.objectweb.asm和org.objectweb.asm.signature包定义了基于事件的API,并且提供了类分析器和读写器组件。他们包含在asm.jar中。

l  org.objectweb.asm.util在asm-util.jar包中,提供了许多基于core API(基于事件)的工具,这些工具可以在开发和debug ASM应用的时候使用。

l  org.objectweb.asm.commons提供了许多有用的预先定义的类转换组件,其中大多数是基于core API。它包含在asm-common.jar中。

l  org.objectweb.asm.tree package定义了基于对象的API,并且提供了基于事件和基于对象之间的转换工具。它包含在asm-tree.jar中。

l   org.objectweb.asm.tree.analysis提供一个类分析框架和许多预先定义的类分析器,基于树的API。它包含在asm-analysis.jar中。

文档包含两个部分。第一部分涵盖了 core API以及asm, asm-util和asm-commons包。第二部分涵盖了树API以及asm-tree和asm-analysis。每个部分至少包含一个与类相关的API章节、一个与方法相关的API章节以及一个和注释、类的类型相关的API章节。每个章节涵盖了编程接口、相关工具以及预先定义好的组件。所以例子的源代码可以在ASM网站上找到。

这样的组织使得一步步介绍类文件的特点变得简单,但是有时还会需要将一个简单的ASM类分散到许多部分。因此,我们推荐按照文档的顺序来阅读这份文档。

ASM学习笔记--ASM 4 user guide 第一章翻译的更多相关文章

  1. ASM学习笔记--ASM 4 user guide 第二章要点翻译总结

    参考:ASM 4 user guide 第一部分 core API 第二章  类 2.1.1概观 编译后的类包括: l  一个描述部分:包括修饰语(比如public或private).名字.父类.接口 ...

  2. 《python基础教程(第二版)》学习笔记 列表/元组(第2章)

    <python基础教程(第二版)>学习笔记 列表/元组(第2章)序列中的下标从0开始x='ABC' ==> x[0]='A', x[1]='B', x[2]='C'负数索引从右边开始 ...

  3. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...

  4. 强化学习 reinforcement learning: An Introduction 第一章, tic-and-toc 代码示例 (结构重建版,注释版)

    强化学习入门最经典的数据估计就是那个大名鼎鼎的  reinforcement learning: An Introduction 了,  最近在看这本书,第一章中给出了一个例子用来说明什么是强化学习, ...

  5. node.js学习笔记(一)——创建第一个应用

    巧妇难为无米之炊.要学习node.js,当然必须先有node.js环境(可以去官网 http://nodejs.cn/ 下载安装),如果还是不懂怎么配置开发环境,度娘会告诉你一切. 安装完成环境之后, ...

  6. 【C语言C++编程学习笔记】基础语法,第一个简单的实例编程入门教程!

    C语言/C++编程学习:一个简单的实例 让我们来看一个简单的C语言程序.从下面的程序可以看出编写C语言程序的一些基本特征.   如果你能知道该程序将会在显示器上显示一些内容,那说明你还是知道一些的! ...

  7. python学习笔记之基础一(第一天)

    1. python字符介绍 在C语言中没有字符串,只有字符 在python中的字符串hello,在C语言中是以字符数组在内存存放['h','e','l','l','o'],如果对字符串修改,则是在内存 ...

  8. SDL2.0 学习笔记-1 windows下的第一个测试程序

    SDL全称是Simple DirectMedia Layer,是一个开源的.跨平台(win32,linux,mac)的多媒体开发c语言库. 官方网站 http://www.libsdl.org/ 第一 ...

  9. Python 学习笔记(六)Python第一个程序

    Python 语句 赋值语句 1.将3对象赋值给了变量a 2.将3,4赋值给了变量a,b >>> a = 3 >>> a ,b = 3,4 >>> ...

随机推荐

  1. 进阶《Python高性能编程》中文PDF+英文PDF+源代码

    入门使用高性能 Python,建议参考<Python高性能编程>,例子给的很多,讲到高性能就会提到性能监控,里面有cpu mem 方法的度量,网络讲了一点异步,net profiler 没 ...

  2. PHP定时执行任务

    ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $int ...

  3. [Python] Manage Dependencies with Python Virtual Environments

    Virtual Environments ensure that dependencies from one Python application don’t overwrite the depend ...

  4. androidclient和站点数据交互的实现(基于Http协议获取数据方法)

    androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...

  5. ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态

    SQL> drop user aaa ;   drop user aaa   ORA-00604: 递归 SQL 级别 1 出现错误 ORA-06575: 程序包或函数 NO_VM_DROP_P ...

  6. 第8章7节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-小结

    最后我们对MonkeyRunner启动的过程做一个总结,当然,当中也包括启动Monkey,尽管它不属于启动过程的一部分: monkeyrunner这个shell脚本会先设置一些执行环境的系统属性保存到 ...

  7. php输出杨辉三角

    php输出杨辉三角 一.截图 二.代码 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  8. SQL Server performance for alter table alter column change data type

    最近在搞一个升级脚本,发现有一张业务表中的某些字段长度需要调整,直接使用alter table alter column进行修改发现修改一列要用十几分钟!!!两三个列那用时简直不能容忍啊!google ...

  9. 配置Lotus Domino集群视频详解

    IBM Lotus Domino Server 有个最重要的高可用特新就是集群,它对于任何使用 Domino 服务器的组织,让用户能够持续访问它们的数据库,保证业务不间断运行.下面通过两个视频来学习如 ...

  10. Index was out of range

    Index was out of range. Must be non-negative and less than the size of the collection. Parameter nam ...