- 浏览: 848004 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
loveseed1989:
您好,我用您的方法运行Cone.java,会给我报java.l ...
vtk学习笔记 --- 编译vtk库和java库 -
60love5:
60love5 写道首先谢谢你的解析,但你这个验证可见性的小程 ...
多线程中共享对象的可见性 -
60love5:
首先谢谢你的解析,但你这个验证可见性的小程序是存在问题的,你的 ...
多线程中共享对象的可见性 -
Gamehu520:
...
java 中的Unsafe -
shanpao1234560:
这个list不是静态的第一种情况下也会有线程安全的问题么,求指 ...
一个看似线程安全的示例
ASM 3.0
Java 字节码引擎库
1简介
1.1动机
程序分析,生成以及转换是很有用的技术手段,可以应用在很多场景下:
- 程序分析,涉及的范围很广,从简单的语法解析到完整的语义分析,也可用来发现程序中潜在的bug,检测未使用的代码,以及反向工程等。
- 用来帮助编译器生成代码。包括传统的编译器,用在分布式编程中的内嵌的编译器,以及即时编译器等。
- 程序转换可以用来优化程序或者对程序进行混淆,或者在应用中插入调试代码或者性能监控代码,再或者面向切面编程等。
所有的这些技术可以用在任何编程语言中,只是针对不同的编程语言,实现的难度也不尽相同。对应java语言,这些技术可以用在java源代码或者编译过的java类文件上。能够对编译过的java类文件进行处理,有一个明显的优势,那就是不需要源代码。程序转换也因此可以使用在任何应用程序上,包括闭源的和商业的。针对编译后的代码的处理,另外一个优势就是可以在运行时,也就是在这些代码被加载进入虚拟机之前(在运行时生成代码并编译源代码是可能的,但是速度很慢,并且需要一个全功能的java编译器),对类文件进行分析、生成或者转换。对用户而言,这些优势就是内嵌编译器或者切面编程对用户是不可见的。
由于程序分析、生成和转换存在很多应用需求,所以人们针对不同的编程语言,这也包括java,实现了很多工具来进行程序分析、生成和转换。ASM就是这些工具中的一员,其主要是面向java。ASM被设计用以在运行时对java类进行生成和转换,当然也包括离线处理。ASM库主要是工作在编译好的java类之上。ASM被设计的短小精悍,尽量保证其速度很快,同时库的容量又很小。ASM快速的目标就是避免在运行时动态生成class和转换对应用程序的速度影响。由于ASM库容量很小,因此,它可以被用在很多内存受限的环境中,同时避免导致小应用程序或者库的容量变大。
ASM不仅仅是生成和转换编译后的java类的工具,而且它也是最有效的。它可以从http://asm.objectweb.org上下载得到。它的主要优势包括如下几方面:
- 它有一个很小,但是设计良好并且模块化的API,且易于使用。
- 它具有很好的文档,并且还有eclipse插件。
- 它支持最新的java版本,java 6。
- 它很小,很快,很健壮。
- 它有一个很大的用户社区,可以给新用户提供支持。
- 它的开原许可允许你几乎以任何方式来使用它。
1.2概述
1.2.1范围
ASM库的目标是生成、转换和分析编译后的java类,在虚拟机中以字节数组表示(它们是保存在硬盘上,在运行的时候被加载入java虚拟机)。基于这个目标,ASM提供了对这些字节数组进行读取,写入和转换的工具,这些工具使用更高级别的概念,而非字节,比如数字常量,字符串,java标识符,java类型,java类结构元素等等。注意,ASM库的范围严格限于对java类进行读取,写入,转换以及分析。Java类文件的加载过程超出了该范围。
1.2.2模型
ASM库提供了两套API用来生成、转换编译后的java类:核心的API是基于事件的,而Tree API是基于对象的。
在基于事件的模型中,一个java类表现为一系列事件,每一个事件代表了类中的一个元素,如类的头部,字段,方法声明,或者指令等。基于事件的API定义了一系列的事件以及这些事件发生的顺序,并且提供了一个类解析器,这个解析器在解析到一个类元素时,就会生成一个事件,与此对应的,类写入器在发生这些事件的时候生成编译后的类。
在基于对象的模型中,一个java类表现为一个对象树,每一个对象代表了类中的一部分,入类本身,一个字段,一个方法或者指令等。每个对象都具有指向其组成成分的引用。基于对象的模型提供了一种方式,用来将代表类的一系列事件转换为一颗对象树,反之亦然,将一颗对象树转换为一系列对等事件。换句话说,基于对象的模型是构建在基于事件的模型之上。
这两套API可以和java中的XML解析库SAX(the Simple API for XML)和DOM(Document Object Model) API来对比。基于事件的API类似于SAX,而基于对象的API类似于DOM。基于对象的API构建在基于事件的API之上,类似于DOM可以在SAX之上使用。
ASM之所以提供了两套API,那是因为没有最好的API,这两套API具有它的优势和缺点:
- 基于事件的API速度更快,需要的内存空间要小于基于对象的API,因为没必要在内存中保留一个代表类结构的对象树(这个不同同时也存在于SAX和DOM之间)。
- 但是,通过基于事件的API来实现类的转换比较困难,因为在给定的时间,只有一个与该事件对应的元素可用。但是,基于对象的API能够在内存中保留整个类。
注意,这两套API在一个时刻都只能处理一个类,并且不依赖于其他类:因为没有维护关于类结构的信息,因此如果一个类的转换影响了其他类,那么由用户来决定是否修改其他类。
1.2.3架构
ASM应用有一个健壮的架构。基于事件的API,在事件的产生者(类解析器)的周围,是事件的消费者(类写入器),以及一些预定义的事件过滤器,用户自定义的事件产生者、消费者和过滤器都可以被添加进去。可以按照以下的两个步骤来使用API:
- 将事件的产生者、过滤器和消费者组件放置到架构的合适位置,
- 然后,启动事件的产生者进行类生产或者转换。
基于对象模型的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-common.jar归档中。
- org.objectweb.asm.tree包,包含在asm-tree.jar归档中,定义了基于对象模型的API,同时也提供了一些工具对基于事件的和基于对象模型的展现进行转换。
- org.objectweb.asm.tree.analysis包提供了一个类分析框架,以及几个预定义好的类分析器,基于tree API。它包含在asm-analysis.jar归档中。
文档被组织为两部分,第一部分,覆盖了核心API,如asm,asm-util和asm-commons归档。第二部分覆盖了tree API(基于对象模型的API),如asm-tree和asm-analysis归档。每部分包含至少一章用来介绍与类相关的API内容,一章与方法相关的API,一章与注解、泛型等相关的API。每章都讲解了编程接口,以及相关的工具,和预定义好的组件等。所有这些例子的源代码可在该地址下载:http://asm.objectweb.org/。
字体约定
Italic斜体 用来强调句子中的元素。
等宽字体 表示代码片段
等宽粗体 表示强调代码元素
Italic等宽斜体 表示代码中的变量部分和标签
1.4致谢
我非常感谢François Horn 在该文档拟定过程中的珍贵的评论,这帮助改善了文档的结构和可读性。
评论
鄙人最近在使用asm做一些bytecode的操作,发现其在visitVarInsn时,只能知道变量索引,而没有相关的API找到这个变量的类型,楼主翻译了这个指南,asm的应用水平一定很高,能否指点一下
过奖了。
翻译这个文档,也是因为当初做一个jvm监控系统未找到相关的文档。
有问题可以相互交流。
性能,异常信息,以及抓取特殊的方法参数等等。
鄙人最近在使用asm做一些bytecode的操作,发现其在visitVarInsn时,只能知道变量索引,而没有相关的API找到这个变量的类型,楼主翻译了这个指南,asm的应用水平一定很高,能否指点一下
过奖了。
翻译这个文档,也是因为当初做一个jvm监控系统未找到相关的文档。
有问题可以相互交流。
性能,异常信息,以及抓取特殊的方法参数等等。
鄙人最近在使用asm做一些bytecode的操作,发现其在visitVarInsn时,只能知道变量索引,而没有相关的API找到这个变量的类型,楼主翻译了这个指南,asm的应用水平一定很高,能否指点一下
过奖了。
翻译这个文档,也是因为当初做一个jvm监控系统未找到相关的文档。
有问题可以相互交流。
鄙人最近在使用asm做一些bytecode的操作,发现其在visitVarInsn时,只能知道变量索引,而没有相关的API找到这个变量的类型,楼主翻译了这个指南,asm的应用水平一定很高,能否指点一下
过奖了。
翻译这个文档,也是因为当初做一个jvm监控系统未找到相关的文档。
有问题可以相互交流。
鄙人最近在使用asm做一些bytecode的操作,发现其在visitVarInsn时,只能知道变量索引,而没有相关的API找到这个变量的类型,楼主翻译了这个指南,asm的应用水平一定很高,能否指点一下
等把核心部分翻译完了,会把它们整理为pdf贴出来下载
Thanks!
希望坚持把它翻译完!
发表评论
-
基于Oracle Streams + Oracle AQ 捕获变更,发布变更(二)
2014-11-21 22:23 3216要求:使用Oracle Streams捕获某个用户下部 ... -
基于Oracle Streams + Oracle AQ 捕获变更,发布变更(一)
2014-11-20 22:23 2806要求:使用Oracle Streams捕获某个用户下部分表 ... -
如何去掉在浏览器中打开java applet时的警告对话框
2013-08-24 12:10 6999好久没更新博客了! 最近,由于项目要求,需要将sw ... -
Android 内存泄露笔记
2013-03-05 23:10 01、大部分内存泄露都是错误的持有了Activity或者Con ... -
java 虚拟机总结 【思维导图】
2012-12-22 20:11 2098java虚拟机总结思维导图: 参考《深入理解jav ... -
Java虚拟机字节码执行引擎 【思维导图】
2012-12-22 19:51 1689java虚拟机字节码执行引擎思维导图总结: 参考《深入理 ... -
java 垃圾回收相关总结 【思维导图】
2012-12-21 19:03 3289java垃圾回收相关总结: 参考《深入理解java ... -
java并发中的延迟初始化
2012-12-12 19:17 4708在《java并发编程实战 ... -
java同步容器与并发容器
2012-12-09 18:07 4365何为同步容器:可以简 ... -
一个看似线程安全的示例
2012-12-09 14:56 5082在《java并发编程实战》第四章4.4.1节给出了一个程序示 ... -
多线程中的long和double
2012-12-08 19:26 4208在看一些代码的时候,会发现在定义long型和double型的 ... -
多线程中共享对象的可见性
2012-12-08 18:52 5156在阅读《java并发编程实战》的第三章的时候,看到书中的一个 ... -
一个快速、轻量级 Collection 库 Trove
2012-12-07 09:35 3768Trove一个快速、轻量级针对java原子类型(byte,i ... -
java 中的Unsafe
2012-12-05 22:25 32764在阅读AtomicInteger的源码时,看到了这个类:su ... -
在ubuntu10上编译Thrift0.8.0
2012-08-01 15:34 2160下载thrift0.8.0 ,地址: http:// ... -
生活小工具--记账小助手1.0发布
2012-05-31 15:08 1760因为自己平时喜欢记账,把每日的消费情况都记录下来,所以希望找 ... -
话费速查升级版v1.3发布
2012-05-04 12:47 1443前段时间开发了一个话费速查的小应用,最近一直保持每周更新一个 ... -
编译zeromq的java绑定:jzmq
2012-05-03 22:47 135521、 下载zeromq源码:http://www.ze ... -
Android软件包静默安装小应用 - 附源码
2012-04-21 20:50 12424老早之前,写了一个android软件包静默安装的应用,放在工 ... -
最方便的联通话费,余额查询软件来了! --- 联通话费速查v1.2
2012-04-12 18:01 4049软件介绍: 联通话费速查是一款针对联通 ...
相关推荐
### ASM3.0指南翻译——深入理解Java字节码引擎库 #### 1. 引言与背景 在软件开发领域,程序分析、生成及转换技术的应用极为广泛,覆盖从语法解析到语义分析,再到代码优化、混淆、调试、性能监控及面向切面编程等...
根据提供的文件信息,以下是关于“ASM4使用指南.pdf”文档中所提及知识点的详细介绍: 1. ASM库介绍: ASM(Java字节码操作和分析框架)是一个Java字节码操作与分析框架。它被设计用于直接以类文件的形式读写和修改...
根据给定的文件信息,我们可以提炼出以下几个关键的知识点,主要围绕着ASM30-LINK30和实用程序用户指南,以及Microchip Technology Inc.的相关信息进行深入解析: ### 1. 微芯科技(Microchip Technology Inc.)...
在压缩包中的"读我.txt"文件,很可能是C32Asm的使用指南或注意事项,它可能包含了安装步骤、配置选项、命令行参数以及一些使用技巧。而"c32asm"可能是个可执行文件,即C32Asm工具本身,或者是一个示例文件,用于演示...
描述中提到的“汉化了的,好用”,意味着这个win32asm工具已经被翻译成了中文,这对于中文用户来说是一个极大的便利,因为它消除了语言障碍,使得不懂英文的开发者也能轻松使用。通常,反汇编器的界面和文档都是英文...
《汇编程序员之代码风格指南》,此书是我自己翻译的中文版,网上已有很多 地方可下载,学习汇编语言而不注意编码风格是很吃亏的事,此书能教你什么时候 该做什么,什么时候不应该做什么。良好的编码风格对于win32...
- `armasm.exe`:ARM汇编器,用于将汇编语言翻译成机器码。 - `armcc.exe`:ARM C编译器,用于将C语言源代码编译成汇编代码或机器码。 - `armcpp.exe`:ARM C++编译器,用于处理C++源代码。 - `armlink.exe`:...
本指南由著名的汇编语言专家Randall Hyde撰写,并由jhkdiy翻译成中文版。该指南旨在帮助程序员理解如何提高他们所编写的汇编代码的可读性。书中通过一系列实例来展示常见的问题及其解决方案,这些实例均来自互联网上...
- `result1.coe`和`result2.asm`:可能分别是汇编后的结果和反汇编的结果文件。 - `HextoMIPS.coe`:可能包含十六进制表示的MIPS机器码,可能需要通过汇编器或反汇编器处理。 - `ConsoleApplication1.sln`:这是...
本中文手册是由一位热心人士翻译整理的,其内容主要摘自GNU C编译器的官方文档。手册旨在为用户提供一个简明扼要的GCC使用指南,特别是针对编译器选项的解释。 #### 二、手册重要声明 1. **免责声明**:手册的内容...
### Linux 汇编语言开发指南 #### 一、简介 汇编语言作为一种低级语言,在现代编程领域中虽然不如高级语言那样普及广泛,但它在特定场景下的优势不容忽视。尤其是在Linux环境中,汇编语言被用于优化性能敏感的模块...
- 中文伪指令.txt 可能包含了易语言中的特殊指令,这些指令在易语言中用中文表示,但被翻译为对应的汇编指令。 - 测试代码.txt 包含了一些示例代码,用于测试软件的功能和性能。 - 高级指令.txt 可能介绍了更复杂或...
全部翻译完了,给我的感觉就是这篇文章是为已有汇编基础但从未接触过Windows汇编编程的读者写的,虽然对我来说这些内容很简单,但也觉得说的很详细了,好过国内许多三言两语的所谓菜鸟教程;但如果读者想全面学习Win...
1. 文件配置和单位设置 - `drawing_setup_filecns_cn.dtl`:这可能是一个Pro-E的绘图设置文件,其中包含了针对中文用户界面的定制化设置,通常用于定义工程图模板和绘图标准。 - `pro_unit_lengthunit_mm` 和 `pro...
2. **限制性使用**:根据许可证协议中的规定,用户不得擅自复制、翻译、广播、修改、授权、传输、分发、展示或表演软件的任何部分,除非许可证协议中有明确规定或许可,或者法律允许的情况。 3. **反向工程禁止**:...
在提供的文件列表中,"huibian.doc"可能是关于ASM乐曲程序设计的一个指南或教程,可能详细介绍了如何编写和调试ASM代码以创建音乐程序。而"www.pudn.com.txt"可能是从一个编程讨论论坛或资源网站下载的资料,可能...
1. **32位汇编语言基础**: - **汇编语言简介**:介绍汇编语言的基本概念、特点及其与高级语言的区别。 - **32位体系结构概述**:讲解32位处理器的特点及工作原理。 - **基本指令集**:介绍常用的汇编指令,如...