ASM 系列详细教程-02-ASM 整体概览
动机
程序分析,生成和转换是有用的技术,可以在许多情况下使用:
程序分析
范围从简单的语法分析到完整的语义分析,可用于查找应用程序中的潜在错误,检测未使用的代码,反向工程代码等。
在编译器中使用程序生成。
其中包括传统的编译器,还有用于分布式编程的存根或骨架编译器,即时编译器等
程序转换可用于优化或混淆程序,
将调试或性能监控代码插入应用程序,用于面向方面的编程等
所有这些技术都可以用于任何编程语言,但这或多或少容易实现,具体取决于语言。
对于Java,它们可以在Java源代码或已编译的Java类上使用。
处理已编译类的优点之一是,显然,不需要源代码。
因此,程序转换可用于任何应用程序,包括封闭源代码和商业应用程序。
处理已编译代码的另一个优点是,可以在将类加载到Java虚拟机中之前在运行时分析,生成或转换类(可以在运行时生成和编译源代码,但这确实很慢,并且需要完整的Java编译器)。
优点是存根编译器(stub compilers)或Aspect Weaver等工具对用户透明。
由于程序分析,生成和转换技术的许多可能用法,因此已经为许多语言(包括Java)实现了许多用于分析,生成和转换程序的工具。
ASM 的作用
ASM是Java语言的其中一种工具,旨在用于运行时(但也可以脱机)类生成和转换。
因此,ASM库被设计为在编译的Java类上工作。
尽可能的小
它还被设计为尽可能快和尽可能小。
为了不减慢速度,尽可能快是很重要的在运行时使用ASM进行动态类生成或转换的应用程序过多。
为了在内存受限的环境中使用,并避免过大的膨胀,尽可能地小非常重要。
使用ASM的小型应用程序或库的大小。
其他作用
ASM不是生成和转换已编译Java的唯一工具类,但是它是最新且有效的类之一。
可以下载来自http://asm.objectweb.org。
其主要优点如下:
它具有简单易用,设计良好的模块化API。
有据可查,并且具有关联的Eclipse插件。
它支持最新的Java版本Java 7。
它体积小,速度快并且非常坚固。
其庞大的用户社区可以为新用户提供支持。
其开源许可证允许您以几乎任何所需的方式使用它。
概览
Scope
ASM库的目标是生成,转换和分析以字节数组表示的已编译Java类(因为它们存储在磁盘上并已加载到Java虚拟机中)。
为此,ASM提供了使用比字节更高的概念来读取,写入和转换此类字节数组的工具,例如数字常量,字符串,Java标识符,Java类型,Java类
结构元素等
请注意,ASM库的范围严格限于读取,编写,转换和分析类。
特别是,类加载过程超出了范围。
Model
ASM库提供了两个用于生成和转换已编译类的API:
核心API提供基于事件的类表示,而树API提供基于对象的表示。
在基于事件的模型中,一个类由一系列事件表示,每个事件代表该类的元素,例如其标题,字段,方法声明,指令等。
基于事件的API定义了可能的事件集以及它们必须发生的顺序,并提供了一个类解析器,该类解析器为每个被解析的元素生成一个事件,以及一个类编写器,从这些事件的序列中生成已编译的类。
在基于对象的模型中,用对象树表示一个类,每个对象代表该类的一部分,例如类本身,字段,方法,指令等,每个对象都具有对这些对象的引用。 代表其成分。
基于对象的API提供了一种将表示类的事件序列转换为表示对象的对象树的方法。
相同的类,反之亦然,将对象树转换为等效的事件序列。
换句话说,基于对象的API建立在事件之上基于API。
二者的关系
这两个API可以与XML文档的简单API(SAX)和文档对象模型(DOM)API进行比较:
基于事件的API与SAX相似,而基于对象的API与DOM类似。
基于对象的API建立在基于事件的API之上,就像可以在SAX之上提供DOM一样。
ASM提供这两种API,因为没有最佳的API。
优缺点
实际上,每个API都有自己的优点和缺点:
与基于对象的API相比,基于事件的API更快,并且所需的内存更少,因为不需要创建并在内存中存储代表该类的对象树(SAX和DOM之间也存在相同的区别)。
但是,使用基于事件的API来实现类转换可能会更加困难,因为在任何给定时间只有该类的一个元素(与当前事件相对应的元素)才可用,而整个类都可以在基于对象的内存中使用 API。
请注意,这两个API一次仅管理一个类,而与其他API无关:
不维护有关类层次结构的信息,并且如果类转换影响其他类,则由用户决定是否修改这些其他类。
Architecture
ASM应用程序具有强大的体系结构方面。
实际上,基于事件的API是围绕事件生成器(类解析器),事件使用者(类编写器)和各种预定义的事件过滤器组织的,可以向其中添加用户定义的生产者,使用者和过滤器。
因此,使用此API分为两个步骤:
(1)将事件产生器,过滤器和使用者组件组装成可能复杂的架构,
(2)然后启动事件生产者以运行生成或转换过程。
基于对象的API也具有体系结构方面:
确实可以构成对对象树进行操作的类生成器或转换器组件,它们之间的链接表示转换的顺序。
组织信息
ASM库组织在几个软件包中,这些软件包分布在多个jar文件:
- org.objectweb.asm和org.objectweb.asm.signature
包定义基于事件的API,并提供类解析器和编写器组件。
它们包含在asm.jar存档中。
asm-util.jar存档中的org.objectweb.asm.util包,提供了基于核心API的各种工具,这些工具可以在ASM应用程序的开发和调试。
- org.objectweb.asm.commons
包提供了几个有用的预定义类转换器,主要基于核心API。
它包含在asm-commons.jar存档中。
- asm-tree.jar
存档中的org.objectweb.asm.tree包,定义基于对象的API,并提供在基于事件和基于对象的表示形式。
- org.objectweb.asm.tree.analysis
包提供类分析框架和几个基于树的预定义类分析器API。
它包含在asm-analysis.jar存档中。
文档划分
本文档分为两部分。
第一部分介绍了核心API,即asm,asm-util和asm-commons存档。 第二部分介绍了树API,即asm-tree和asm-analysis存档。
每一部分至少包含一章与类相关的API,一章与方法相关的API,以及一章与注释,泛型等相关的API。
每章均涵盖编程接口以及相关工具和预定义的组件。
所有示例的源代码都可以在ASM网站上找到。
这种组织结构使逐步引入类文件功能变得容易,但有时需要将单个ASM类的表示形式分散在几个部分中。
因此,建议按顺序阅读本文档。
整体时序图
AOP 技术对比
AOP 底层技术 | 功能 | 性能 | 面向接口编程 | 编程难度 |
---|---|---|---|---|
直接改写 class 文件 | 完全控制类 | 无明显性能代价 | 不要求 高,要求对 class 文件结构和 Java 字节码有深刻了解 | |
JDK Instrument | 完全控制类 | 无论是否改写,每个类装入时都要执行 hook | 程序 不要求 高,要求对 class 文件结构和 Java 字节码有深刻了解 | |
JDK Proxy | 只能改写 method | 反射引入性能代价 | 要求 低 | |
ASM | 几乎能完全控制类 | 无明显性能代价 | 不要求 中,能操纵需要改写部分的 Java 字节码 |
拓展阅读
更多技术文章,生活趣事,尽在【老马啸西风】。
参考文档
https://asm.ow2.io/asm4-guide.pdf
ASM 系列详细教程-02-ASM 整体概览相关推荐
- ASM 系列详细教程-20-ASM Method 方法分析介绍
方法分析 本章介绍基于树API的ASM API,用于分析方法代码. 首先介绍代码分析算法,然后提供相应的ASM API和一些示例. 介绍 代码分析是一个非常大的主题,并且存在许多用于分析代码的算法. ...
- 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)
大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...
- 【Mermaid 语法详细教程 01】 流程图(Flowchart / graph)
说明 mermaid是一种解决文字图形转换的方案,用于在markdown标记语言中利用文本绘图,本文内容保证适合mermaid 8.8.3的内容,向上更新的内容不论. 本篇作为mermaid教程系列的 ...
- #ASM 翻译系列第三十二弹:ASM INTERNAL Find block in ASM
原文: Find block in ASM 作者: Bane Radulovic 译者:魏兴华,沃趣科技高级技术专家,主要参与公司一体机产品.监控产品.容灾产品.DBaaS平台的研发和设计.曾就职于东 ...
- python数据科学系列:pandas入门详细教程
导读 前2篇分别系统性介绍了numpy和matplotlib的入门基本知识,今天本文自然是要对pandas进行入门详细介绍,通过本文你将系统性了解pandas为何会有数据分析界"瑞士军刀&q ...
- Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程
Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程 一:前言 最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linu ...
- 各学科、各专业、全系列软件图文、视频安装详细教程总贴——CM(changeMax)独家制作,汇总
各学科.各专业.全系列软件图文.视频安装详细教程总贴 你好,我是change max,本人写博客已有一个年头了.经过一年多的沉淀,我发现了一个现状: 对于各种专业性的技术贴各位的关注度不高,或者说,本 ...
- 系统开发系列 之MyEclipse创建WebService详细教程和调用教程(spring框架+maven+CXF框架)
1 回顾 [系统开发系列 之MyEclipse创建WebService详细教程和调用教程]介绍了使用JWS实现WebService接口的发布和调用,主要涉及的点有: (1)MyEclipse点击Fil ...
- Python数据可视化之Plotnine库超详细教程系列
Python数据可视化之Plotnine库超详细教程系列(一):概述 一.Plotnine库简介 ggplot2包奠定了R语言数据可视化在数据科学中的地位,数据可视化一直是Python的短板,即使有M ...
最新文章
- Redhat linux5.5下Oracle 10g 安装配置手册一
- Node.js EventEmitter
- pip install升级包
- 网络服务器分为文件服务器通信服务器和,近代中国落后、贫困的根本原因是()...
- 奇数求和(信息学奥赛一本通-T1065)
- MongoDB 教程番外篇之管理工具: Rockmongo
- Debian/Ubuntu系统下,apt-get update 、apt-get upgrade 、apt-get dist-upgrade 命令之间的区别
- Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性
- 【题解】luoguP2680运输计划
- C#基础知识整理:基础知识(11) 值类型,引用类型
- 数据结构:五岔路口交通管理红绿灯设计
- Enjoy模板里使用layui模板引擎laytpl
- UGUI的ScrollRect
- [转载]CRC校验原理
- 各种泵的图形符号_常见液压系统中液压元件图形符号
- 加速器在模拟器中的尝试
- java浮点类型数据运算并保留小数点后几位工具类
- 汇编3-计算机程序是如何运行的
- 【通知】4月18日22:00至4月19日2:00网站服务暂停公告
- PAT 乙级 1002 写出这个数
热门文章
- EDT(异地通)区块链技术将极大影响的全行业,其中包括支付行业。
- 第31章 Python3 标准库概览教程
- Java SpringBoot 表单提交Json提交 Star.hou
- STM32链接脚本STM32F407ZETx_FLASH.ld
- 新Macbook入手后必安装的好用的软件
- python numpy中fromfile函数的使用
- 基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法
- 冬瓜哥对时间和空间的理解方式—时空参悟(下)
- 在医疗行业中,FPGA扮演什么角色?
- MUSIC算法-呼吸心跳信号检测方法(五)