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.rhkb.cn/news/285581.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Layui的社区物业管理系统

项目介绍 社区物业管理系统是基于java程序开发,本系统分为业主和管理员两个角色 业主可以登陆系统,查看车位费用信息,查看物业费用信息,在线投诉,查看投诉,在线报修; 管理员可以车位收费信息,物业收费信息,投诉信息,楼宇信息,房屋信息,业主信息,车位信息,抄表信…

芯片设计工程师必备基本功——《Verilog+HDL应用程序设计实例精讲》

进入芯片行业需要学习哪些基本功呢?其实芯片设计工程师的技能是通过多年的经验学习的。在您开始作为芯片设计工程师工作之前,很难给出一个需要的全面的单一列表,也不可能学习所有内容。话虽如此,但您开始芯片设计师职业生涯时必须…

瑞萨杯(一)

基础信息 RA6M5:ARM V8架构,24MHz外置晶振,200MHz主频 SCI(Serial Communications Interface),意为串行通信接口 参考链接: 【瑞萨RA系列FSP库开发】RASCKeil的环境搭建_瑞萨ra mdk-CSDN博客…

Web安全基础入门+信息收集篇

教程介绍 学习信息收集,针对域名信息,解析信息,网站信息,服务器信息等;学习端口扫描,针对端口进行服务探针,理解服务及端口对应关系;学习WEB扫描,主要针对敏感文件,安全漏洞,子域名信息等;学习信息收集方法…

【webpack】----错误解决【Cannot read properties of undefined (reading ‘tap‘)】

1. 报错场景 安装 webpack-obfuscator 后,进行 js 代码混淆编译的时候报错。 2. 报错截图 3. 错误原因 通常是由于版本不兼容或配置错误引起的。 4. 查询本地 webpack 版本 4.1 查询命令 npm 查询 npm view webpack versionyarn 查询 yarn info webpack ver…

2024年第14届生物医学工程与技术国际会议(ICBET 2024)即将召开!

2024年第14届生物医学工程与技术国际会议(ICBET 2024)将于2024年6月14日至17日在韩国首尔举行。 会议旨在汇聚来自世界各地的研究人员、工程师、院士和行业专业人士,展示他们在生物医学工程与技术领域的最新研究成果和进展。 会议以“生物医学…

欧拉法和Runge-Kutta(龙格-库塔)方法

Euler方法有各种格式,但其精度最高不超过2阶,一般难以满足实际计算的精度要求。因此,有必要构造精度更高的数值计算公式求解微分方程。Runge-Kutta方法就是一种高精度的经典的解常微分方程的单步方法。 下面是欧拉法例子: 参考链接…

【JavaEE -- 网络初识】

网络初识 1. 局域网和广域网1.1 局域网(LAN)1.2 广域网WAN 2. 网络通信基础2.1 IP地址2.2 端口号 3. 协议 -- 重点3.1 网络通信协议拆分成多层3.2 TCP/IP 五层网络协议 4. 封装和分用4.1 封装过程4.2 分用过程4.3 网络传输的数据单位 5. 网络编程中的客户…

Java基础-反射

文章目录 1.快速入门1.案例引入2.代码实例3.反射机制原理图 2.反射相关类1.反射获取类的成员代码实例结果 2.反射调用优化1.关闭访问检查2.代码实例 3.Class类1.类图2.基本介绍3.Class类常用方法代码实例结果 4.获取Class类对象代码实例结果 5.哪些类型有Class对象 4.类加载1.基…

学习刷题-13

3.23 hw机试【二叉树】 剑指offer32 剑指 offer32(一、二、三)_剑指offer 32-CSDN博客 从上到下打印二叉树I 一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照从 左 到 右 的顺序返回每一层彩灯编号。 输…

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景: Sentinel 承接了阿里巴…

微服务(基础篇-003-Nacos集群搭建)

目录 Nacos集群搭建 1.集群结构图 2.搭建集群 2.1.初始化数据库 2.2.下载nacos 2.3.配置Nacos 2.4.启动 2.5.nginx反向代理 2.6.优化 视频地址: 06-Nacos配置管理-nacos集群搭建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p29&…

Vue字符串里的中文数字转换为阿拉伯数字

js字符串里的汉字数字转化为数字 <template><view><view><view class"inpbox" ><textarea v-model"voiceMane" input"convert" ></textarea></view></view></view> </template> &…

SpringCloudAlibaba之Nacos Config

1、服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个微服务架构下&#xff0c;配置文件会随着微服务的增多变的越来越多&#xff0c;而且分散在各个微服务中&#xff0c;不好统一配置和管理。配置文件无法区分环境…

【windows】安装 Tomcat 及配置环境变量

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

Protobuf基础使用

Protobuf是什么 在我们日常编写代码的过程中&#xff0c;经常会涉及到网络传输的部分。我们通常会在网络之间传递各种各样的请求&#xff0c;但是在我们日常架构之中&#xff0c;经常会涉及后端服务器之间的通信&#xff0c;通信过程中&#xff0c;可能传递的对象就是一个类。…

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解&#xff0c;让大家熟练虚拟机的安装使用&#xff0c;Linux系统的安装配置&#xff0c;学习掌握linux系统常用命令的使用&#xff0c;常用的软件安装方法&#xff0c;制作快照&#xff0c;克隆&#xff0c;完成免密登录&…

springboot企业级抽奖项目业务三(活动模块)

梅开三度 开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在用户模块用户…

泰迪智能科技荣获山东省“技能兴鲁”职业技能大赛优秀组织奖

近日&#xff0c;泰迪智能科技荣获了山东省“技能兴鲁”职业技能大赛——第四届山东省“云数”技能竞赛“优秀组织单位”。 据悉&#xff0c;山东省“技能兴鲁”职业技能大赛——第四届山东省“云数”技能竞赛是由山东电子学会、山东省信息产业协会主办的&#xff0c;该竞赛是通…

32.HarmonyOS App(JAVA)鸿蒙系统app类自动生成GetSet方法

1.空白区域右键单击 2.选择Generate 3.选择getter,setter 4.选择列出的所有项 5.点击OK 6.成功生成。