ASM四部曲之一:什么是ASM

2024-03-25 12:36
文章标签 asm 四部曲

本文主要是介绍ASM四部曲之一:什么是ASM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 什么是.class文件
  • 什么是ASM
  • 概述
    • 作用域
    • 模型
    • 基于ASM的程序架构
  • ASM库结构

前言

本文翻译自ASM官方文档。

什么是.class文件

Java字节码文件(.class)是Java编译器编译Java源文件(.java)产生的目标文件。它是一种8位字节的二进制流文件, 各个数据项按顺序紧密的从前向后排列, 相邻的项之间没有间隙, 这样可以使得.class文件非常紧凑, 体积轻巧, 可以被JVM快速的加载至内存, 并且占据较少的内存空间。

.java文件在被Java编译器编译之后, 每个类都单独占据一个.class文件, 并且类中的所有信息都会在.class文件中有相应的描述, 由于.class文件很灵活, 它甚至比.java文件有着更强的描述能力。

每个.class文件也被称为一个已编译类。

什么是ASM

程序分析、生成和转换是可以在许多情况下使用的有用技术:

  • 程序分析的范围从简单的语法解析到完整的语义分析,可以用来发现应用程序中的潜在错误,检测未使用的代码,对代码进行逆向工程,等等。
  • 程序生成用于编译器。这包括传统的编译器,也包括用于分布式编程的存根或骨架编译器、即时编译器等。
  • 程序转换可用于优化或混淆程序,在应用程序中插入调试或性能监视代码,用于面向切面编程等。

所有这些技术都可以用于任何编程语言。对于Java来说,它们可以用于Java源代码或已编译类。在已编译类上工作的一个优点是不需要源代码。因此,程序转换可以用于任何应用程序,包括闭源和商业应用程序。处理已编译类的另一个好处是,可以在运行时分析、生成或转换类,就在它们加载到Java虚拟机之前(当然,也可以在运行时生成和编译源代码,但这非常慢,并且需要一个完整的Java编译器)。

ASM就是一种被设计用于分析、生成和转换已编译类的工具,并且它还被设计得尽可能快、尽可能小。

概述

作用域

ASM库的目标是生成、转换和分析已编译类。为此,ASM提供了一些工具,通过使用比字节更高级的概念来读取、写入和转换字节数组,例如数字常量、字符串、Java标识符、Java类型、Java类结构元素等。请注意,ASM库的作用域严格限于读、写、转换和分析字已编译类,禁止将其用于类加载过程。

模型

ASM提供了两个用于生成和转换已编译类的API:

  • 核心API提供基于事件的类表示:在基于事件的模型中,一个类用一系列事件表示,每个事件表示类的一个元素,比如一个字段、一个方法声明、一条指令等。基于事件的API定义了一组可能发生的事件以及它们必须发生的顺序,并提供了一个类解析器,它为被解析的每个元素生成一个事件,还提供了一个类编写器,它根据这些事件的序列生成已编译的类。
  • 树API提供基于对象的表示:在基于对象的模型中,一个类用对象树表示,每个对象表示类的一部分,比如一个字段、一个方法、一条指令等,每个对象都有对表示其组成部分的对象的引用。基于对象的API提供了一种方法,可以将表示类的事件序列转换为表示同一类的对象树,反之亦然,也可以将对象树转换为等效的事件序列。换句话说,基于对象的API构建在基于事件的API之上。

这两个API各自有各自的优缺点:

  • 基于事件的API比基于对象的API更快,并且需要更少的内存,因为不需要在内存中创建和存储表示类的对象树。
  • 然而,使用基于事件的API实现类转换可能会更加困难,因为在任何给定时间,类中只有一个元素可用(与当前事件对应的元素),而使用基于对象的API,整个类在内存中可用。

请注意,这两个API一次只管理一个类,并且独立于其他类,也就是说:不维护有关类层次结构的信息,如果一个类的转换影响到了其他类,那么由用户来决定和修改这些其他类。

基于ASM的程序架构

基于事件的API围绕事件生产者(类解析器)、事件消费者(类编写器)和各种预定义的事件过滤器组织的,其中可以添加用户定义的生产者、消费者和过滤器。因此,使用这个API需要两个步骤:

  • 将事件生产者、过滤器和消费者组件组装到可能复杂的体系结构中
  • 然后启动事件生成器来运行生成或转换过程

基于对象的API可以组合在对象树上操作的类生成器或转换器组件,它们之间的链接表示转换的顺序。

尽管典型ASM应用程序中的大多数组件架构都相当简单,但可以想象如下复杂的架构,其中箭头表示类解析器,编写器或转换器之间基于事件或基于对象的通信,并在链中的任何位置进行基于事件和基于对象的表示之间的可能转换:

在这里插入图片描述

ASM库结构

ASM库被组织在几个包中,这些包分布在几个jar文件中:

  • org.objectweb.asm and org.objectweb.asm.signature包定义了基于事件的API,并提供了类解析器和编写器组件,它被包含在asm.jar中。
  • org.objectweb.asm.util包提供了各种基于核心API的工具,可以在ASM应用程序的开发和调试过程中使用,它被包含在asm-util.jar中。
  • org.objectweb.asm.commons包提供了一些有用的预定义转换器,这些转换器大多基于核心API,它被包含在asm-commons.jar中。
  • org.objectweb.asm.tree包定义了基于对象的API,并提供了在基于事件和基于对象的表示之间进行转换的工具,它被包含在asm-tree.jar中。
  • 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四部曲之一:什么是ASM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845031

相关文章

ASM 10G 基于RMAN 迁移

ASM 10G 基于RMAN 迁移 场景 单节点基于10G R2 的数据库,其数据文件及日志文件均存放在ASM 里,现在为业务需求,将此数据库做迁 移,迁移到另个机房,但是两个机房的网络是通畅的,为尽量减少数据的丢失及平稳迁移和经济实惠,迁 移时,数据库需停应用 工具 本次采用RMAN 的duplicate 命令来进行迁移,运用此命令简化复杂度; 一、源库和目标库的

(转)GCC在C语言中内嵌汇编 asm __volatile__

原地址:https://www.cnblogs.com/c-road/p/6890615.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。 1、简单的内嵌汇编 例: __asm__ __v

【rac asm扩容】在vmware workstation中配置集群(rac)的共享存储(磁盘)方法(流程)

在vmware workstation中配置集群(rac)要用的共享存储(磁盘)方法(流程) 注意:所有机器最好在关机状态下!!! 1)、添加一块新的硬盘 要点:立即分配所有磁盘空间。 要点:将共享的磁盘文件放到一个公共位置(可自定义,但最好不要放在虚拟机文件夹下),例如这里是放在F:\Virtual Machines\ShareDisks目录下(路径最好不要有中文!!

asm常用命令汇总

在Oracle 环境下,使用grid帐号执行 运行asmcmd进入asm命令模式,如: [grid@oradb-node1 ~]$ asmcmd ASMCMD>   ASMCMD> du //显示指定的ASM目录下ASM文件占用的所有磁盘空间 ASMCMD> ls -ls //列出ASM目录下的内容及其属性、磁盘空间占用 ASMCMD> pwd //查看当前路径 ASMCMD> c

WebAssembly 为什么比 asm.js 快?

WebAssembly 是为 Web 而设计的、可以生成浏览器可执行的二进制文件的编程语言。并且于2017 年 2 月 28 日,四个主要的浏览器一致同意宣布 WebAssembly 的 MVP 版本已经完成,即将推出一个浏览器可以搭载的稳定版本。WebAssembly 的一个主要目标就是变快。本文将给出一些它如何变快的技术细节。 阅读全文请点击:WebAssembly 为什么比 asm.js

MDK报错 .error: unknown register name ‘msp‘ in asm

似乎只能安装 V5的编译器 才能解决,下面是安装链接 https://blog.csdn.net/u011436603/article/details/136419969 V5的编译器 CSDN免费下载链接: =========================================================== 以下办法解决不了 解决办法: 在MDK 桌面图标,右击打开安

从Rust到远方:ASM.js星系

来源: https://mnt.io/2018/08/28/from-rust-to-beyond-the-asm-js-galaxy/ 这篇博客文章是这一系列解释如何将Rust发射到地球以外的许多星系的文章的一部分: 前奏,WebAssembly 星系ASM.js星系(当前这一集)C 星系PHP星系,以及NodeJS 星系 Rust解析器将要探索的第二个星系是ASM.js。这篇文章会解释什么是

AIX小机环境如何给ASM添加磁盘

前面几篇介绍了HPUX,Solaris平台上RAC集群ASM如何添加磁盘的 ,三大UNIX平台只差AIX,本文介绍AIX平台RAC 添加ASM磁盘 environment: AIX 6.1 + oracle 10.0.2.4   2 nodes RAC (storage HP-6100 FC disk) 1. 存储划盘,并将盘赋予集群两个节点主机 2. 主机上发现新建磁盘 sfc3ra

nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type

在使用cglib进行动态代理时,很可能会出现下面的异常: NoClassDefFoundError: org/objectweb/asm/Type 当这种异常出现时,可能从下面几个方法查找问题。 1、asm包有没有导入 由于cglib动态代理需要使用asm反射包,所以,如果没有导入asm就会出现org.objectweb.asm.Type类找不到的问题,导入asm包就可以了。 2、a

使用ASM为一个类增加属性工具类

使用ASM可以方便的访问和修改一个类,或者在JVM载入前动态更新一个类也是可以的,如下, 为一个类动态增加一个属性,类Student如下: public class Student {private int age;private String name;public int getAge() {return age;}public void setAge(int age) {this.age