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网站上找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/484068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】vim配置及安装方法

注 安装方法在文章最后 配置文件的位置 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为“.vimrc”。例如&…

Docker搭建LNMP环境实战(03):VMware安装CentOS

Docker搭建LNMP环境实战(03):VMware安装CentOS 1、创建新的虚拟机,选择CentOS7镜像文件,并启动安装 启动VMware,创建新的虚拟机 图1 选择典型安装即可 选用最大最全的CentOS镜像文件:CentOS-7…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感:Remote Sensing 遥测:Telemetry,对被测物体某些运动参数和性质进行远距离测量的技术,分为接触测量与非接触测量,对于RS的概念,遥测探测的目标显得狭隘了一些&#xff…

Machine Learning - Logistic Regression

目录 一、Activation Function Why introduce activation functions? There are several commonly used activation functions: 二、Sigmoid: 三、Logistic Regression Model: 四、Implementation of logistic regression: 五、Decis…

GNU Radio创建Zadoff-Chu序列python OOT块

文章目录 前言一、ZC序列是什么?二、创建自定义的 OOT 块三、相关文件四、测试1、grc 图2、运行结果①、时域图②、时域幅值模图③、IQ 曲线 前言 本文实现在 GNU Radio 中创建 Zadoff-Chu 序列 python OOT 块,仅做代码调试记录。 一、ZC序列是什么&…

java 实现发送邮件功能

今天分享一篇 java 发送 QQ 邮件的功能 环境&#xff1a; jdk 1.8 springboot 2.6.3 maven 3.9.6 邮件功能依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>&…

C语言分支和循环

目录 一.分支 一.if 二.if else 三.if else嵌套 四.else if 五.switch语句 二.循环 一.while (do while&#xff09;break : 二.for函数&#xff1a; 三.goto语句: 四.猜数字: 一.分支 一.if if要条件为真才执行为假不执行而且if只能执行后面第一条如果要执行多条就…

Windows下同时安装多个版本的JDK并配置环境变量

说明&#xff1a;这里安装的JDK版本为1.8和17 JDK下载 官方地址: https://www.oracle.com/java/ 我这里下载的是exe安装包 安装这里就不阐述了&#xff0c;安装方法都是一样的。 系统环境变量配置 1、首先新建JDK1.8和17的JAVA_HOME&#xff0c;他们的变量名区分开&#xff…

MySQL进阶——索引

索引 索引概述 索引结构 索引分类 索引语法 SQL性能分析 索引使用 索引设计原则 概述 介绍 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结…

Redis 教程系列之缓存雪崩,击穿,穿透(十四)

一,缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问…

AJAX介绍使用案例

文章目录 一、AJAX概念二、AJAX快速入门1、编写AjaxServlet&#xff0c;并使用response输出字符&#xff08;后台代码&#xff09;2、创建XMLHttpRequest对象&#xff1a;用于和服务器交换数据 & 3、向服务器发送请求 & 4、获取服务器响应数据 三、案例-验证用户是否存…

ubuntu上一款好用的串口工具screen

看名字&#xff0c;你猜他是什么&#xff1f; 安装 sudo apt install screen 然后将USB串口接到虚拟机&#xff0c;执行dmesg命令查看串口设备名&#xff1a; 测试&#xff1a; sudo screen /dev/ttyUSB0 115200确实很简单。

【C++】list类(使用方法和模拟实现)

一、标准库中的list类 1.1 list类介绍 1.2 list的常用接口 1.2.1 常用的构造函数 1.2.2 容量操作接口 &#xff08;1&#xff09;size &#xff08;2&#xff09;empty &#xff08;3&#xff09;resize 1.2.3 访问和遍历 &#xff08;1&#xff09;迭代器 &#xff…

DC-DC教程,真不错!

大家好&#xff0c;我是记得诚。 交流群读者分享了一个DC-DC的文档&#xff0c;内容还挺好&#xff0c;分享给大家。 文章原链接&#xff1a;DC-DC教程&#xff0c;真不错&#xff01;&#xff0c;可以获取完整的文档。 推荐阅读&#xff1a; 硬件工程师如何零基础入门&#…

数据结构:堆和二叉树遍历

堆的特征 1.堆是一个完全二叉树 2.堆分为大堆和小堆。大堆&#xff1a;左右节点都小于根节点 小堆&#xff1a;左右节点都大于根节点 堆的应用&#xff1a;堆排序&#xff0c;topk问题 堆排序 堆排序的思路&#xff1a; 1.升序排序&#xff0c;建小堆。堆顶就是这个堆最小…

【算法】五道大学生必备平价精致小众松弛感宝藏好题平替

【算法】五道大学生必备平价精致小众松弛感宝藏好题平替x ​ 刚学了Java就想用来写算法题的我&#xff1a; ​ 借着几道算法题&#xff0c;熟悉一下Java中Stack类&#xff0c;String类的用法。 925.长按键入 原题链接&#xff1a; 925. 长按键入 ​ 用来测试与练习String类自带…

php闭包应用

laravel 路由 bingTo 把路由URL映射到匿名回调函数上&#xff0c;框架会把匿名回调函数绑定到应用对象上&#xff0c;这样在匿名函数中就可以使用$this关键字引用重要的应用对象。Illuminate\Support\Traits\Macroable的__call方法。 自己写一个简单的demo: <?php <?…

遍历目录下的某个文件并删除

目录 需求 编写过程 演示 需求 大家在学习时可能会有一个自己的小目录&#xff0c;里面放着各种奇葩代码&#xff0c;有天突然发现&#xff0c;没有空间了&#xff0c;这时候发现遗留了很多的可执行文件&#xff0c;大大的浪费了我们的空间&#xff0c;但是由于层数深&#…

基于SSM的宠物领养平台的设计与实现

基于SSM的宠物领养平台的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全 获取源码——》公主号&#xff1a;计算机专业毕设大全

React腳手架已經創建好了,想使用Vite作為開發依賴

使用Vite作為開發依賴 安裝VITE配置VITE配置文件簡單的VITE配置項更改package.json中的scripts在根目錄中添加index.html現在可以瀏覽你的頁面了 安裝VITE 首先&#xff0c;在現有的React項目中安裝VITE npm install vite --save-dev || yarn add vite --dev配置VITE配置文件 …