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. Centos7最小化安装后再安装图形界面

    1. yum -y groupinstall "X Window System" 2. yum -y groupinstall "GNOME Desktop"  ...

  2. 详解:Linux Chrony 设置服务器集群同步时间

    导读: Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认服务,默认配置文件在 /etc/chrony.conf 它能保持系统时间与时间服务器(NTP)同步,让 ...

  3. Swift学习笔记(9)--闭包

    1.闭包表达式: { (parameters) -> returnType in statements } 注1.闭包表达式语法可以使用常量.变量和inout类型作为参数,不提供默认值. 也可以 ...

  4. POJ——T 2299 Ultra-QuickSort

    http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 62894   ...

  5. 学一下gconv, gprof等知识

    scons.gcc.gdb.valgrind.gcov SCons 是一个用 Python 语言编写的类似于 make 工具的程序.与 make 工具相比较,SCons 的配置文件更加简单清晰明了. ...

  6. QTP校验数据库中数据后台项目

    数据校验功能后台主要包含两个类:QTPCommonServlet.java和QTPCommonDao.java 当中QTPCommonServlet.java为: package com.runqia ...

  7. 在resin配置參数实现JConsole远程监控JVM

    在Resin配置參数实现JConsole远程监控JVM 在Resin中配置中配置下列參数,就能够是实现了! <jvm-arg>-Dcom.sun.management.jmxremote& ...

  8. elasticsearch index 之 create index(-)

    从本篇开始,就进入了Index的核心代码部分.这里首先分析一下索引的创建过程.elasticsearch中的索引是多个分片的集合,它只是逻辑上的索引,并不具备实际的索引功能,所有对数据的操作最终还是由 ...

  9. 一款开源Office软件---Lotus Symphony在Linux系统下的应用

    点击下载观看试用录像   Linux系统下的办公软件有OpenOffice.永中Office.红旗Red Office.金山Wps Office及StarOffice等,今天我为大家介绍IBM推进军O ...

  10. Statement和ResultSet

    statement.prepareStatement.callableStatement的使用 1.带?参数的使用prepareStatement.这也是使用最多的. 2.不带参数,例如查所用,不需要 ...