ASM简介(1)

发表于2019-07-31,长度1037, 33个单词, 2分钟读完
Flag Counter

ASM 是一个Java运行时增强工具,与之类似的还有javassist。ASM 这个名字来源于C语言中内联汇编的关键字__asm,所以它没有特定的含义指向。

ASM的用处

程序分析、生成、转换是许多场景都能用到的彪悍技术。

程序分析小到简单的语法检查,大到复杂的语义分析,可以用于发现潜在的bug、未使用的代码或者反转代码块等。

程序生成是编译器用到的,包括传统的编译器也包括块编译器和分布式编程中的骨架编译器,还有JIT编译器等。

程序转换用于优化代码、植入监控代码等,比如aop技术。

任何语言能都用到这些技术,当然有容易和困难的区分。Java可以将这些技术用在源码或字节码中。在字节码中使用的好处当然就是不需要源码了,程序转换甚至可以用在闭源的商业产品上。另外就是可以在运行期分析、生成、转换代码了,只要在类加载前搞定就行。同时生成并编译也可以,不过很慢。这样块编译器或aop就对用户透明了。

asm的库是作用在字节码上的,很小很快,因为asm不希望用户在使用它的时候感觉到性能或内存空间受到影响。

  1. 它具有简单、设计良好、模块化的api
  2. 文档齐全,还有个Eclipse插件
  3. 支持最新的Java版本
  4. 小、快、健壮
  5. 社区活跃
  6. 开源

asm的目标是生成、转换和分析Java的类文件,它们是字节数组。asm提供了工具读取、写入、转换字节数组,用的是更高阶的概念而非字节,比如数值常量、字符串、Java标志符、类结构元素等。asm严格限制只能读写、转换、分析类而不能加载它们。

API简介

asm库提供了两套api,核心api提供基于事件的类展示。而树API提供基于对象的展示。

基于事件的模型中,类是事件的序列,每个事件是类的一个元素,比如头部、字段、方法申明、指令等。核心API定义了一组可能的顺序事件,还有一个类解析器用于每个元素生成一个事件,还有一个类写入器来把事件序列生成字节码。

基于对象的模型中,类是对象树。每个对象是类的一部分,比如类自身、字段、方法、指令等。每个对象有指向构成自身的对象的引用。树API提供了将事件序列转换为对象树以及反过来转换的方法。所以对象模型在事件模型之上。

asm提供了两套API是因为它们各有优劣:

事件模型很快,占用内存也少,因为它不需要在内存中创建类的对象树。

事件模型难以实现类的转换,因为它每次只处理一个事件,也就是一个类元素,而对象模型更能全局观察。

注意两种API都是每次只处理一个类,需要处理多个类(哪怕是相关联的)就要起多个任务。

Written on July 31, 2019
分类: dev, 标签: java asm
如果你喜欢,请赞赏! davelet