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

相关文章

从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

ASM字节码操纵框架实现AOP

前言 使用ASM改写字节码实现Aop,是最快的Aop实现方式。 我猜你肯定懂AOP 凡是学习Spring框架,必然会深入了解AOP的原理以及实现。这里做下简单总结 Spring默认采取的是动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用CGlib机制。这里的CGlib机制的底层就是基于ASM来实现的。 但是Spring的AOP有一定的缺点,它只能对方法进行切入,不能对接口

ASM字节码插装技术初探

一、ASM简介      ASM(全称:ASMifier Class Visitor)是一个java字节码操纵框架,ASM 提供了许多 API 和工具,可以直接以二进制形式读取和修改类文件、动态生成类或者增强既有类的功能。                 1、 ASM 主要作用        asm用于生成、编辑、分析java的class文件 ◆ 字节码生成          可以通过

ASM-MehotdVisitor实践

使用ASM几乎用户全部的精力都是对MethodVisitor的处理,方法code的处理都需要使用这个类进行操作。还是之前文章说过的,ASM单独学习意义并不大,难以达到触类旁通,先行掌握字节码基础后再玩起ASM才能体会真正的乐趣,不然真的蛮折磨人的。 场景一:需要在方法开始插入代码 这个应该非常简单的,相信对于熟练掌握MethodVisitor方法调用顺序及方法含义的你来说应当不是问题的,vis

【ORACLE RAC】维护:asm维护, srvctl、crsctl,orcconfig等指令的使用。

2 asm ************************************************************************ ****原文:blog.csdn.net/clark_xu  徐长亮的专栏 ************************************************************************ 管理 2.1查看数

创建ASM磁盘组时报磁盘组名称冲突的错误

又一次装RAC创建OCR磁盘组的时候说磁盘组名称冲突,但是我之前并没有创建过。后来通过沟通才知道这台机器之前装过RAC,所以考虑是不是之前的oracle没卸干净。 最后用: <span style="font-size:24px;">dd if=/dev/zero of=/dev/emcpoweri bs=1024 count=5000</span> 这条命令将安装界面扫描到的stat

迁移ASM文件之backup as copy tablespace

在 Oracle 10g数据库中,如果需要将ASM实例中一个磁盘组的数据文件转移到另一个磁盘组上。可以采用以前传统的文件系统的方式迁移,也可以采用表空间级别拷贝的方式迁移。 例如有一个库sdb,users表空间的数据文件都在vg1磁盘组上,现在要移动vg2磁盘组上,这样操作一下就能完成这个任务。 backup as copy tablespace users format '+vg2';