【JVM】ASM开发



认识ASM

ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能

ASM可以直接产生二进制class文件,也可以在类被加载入虚拟机之前动态改变类行为,ASM从类文件中读入信息后能够改变类行为,分析类信息,甚至能根据要求生成新类。

目前许多框架如cglib、Hibernate、Spring都直接或间接地使用ASM操作字节码。

ASM编程模型

1)Core API:提供了基于事件形式的编程模型。该模型不需要一次性将整个类的结构读取到内存中,因此这种方式更快,需要更少的内存,但这种编程方式难度较大。
2)Tree API:提供了基于树形的编程模型。该模型需要一次性将一个类的完整结构全部读取到内存当中,所以这种方法需要更多的内存,这种编程方式较简单。

ASM的核心API

ASM Core API中操纵字节码的功能基于 ClassVisitor 接囗。这个接口中的每个方法对应了 class 文件中的每一项。
ASM 提供了三个基于 ClassVisitor 接囗的类来实现 class文件的生成和转换:
1、ClassReader:ClassReader解析一个类的 class 字节码。2、ClassAdapter:ClassAdapter是ClassVisitor 的实现类,实现要变化的功能。3 、ClassWriter:ClassWriter也是 ClassVisitor 的实现类,可以用来输出变化后的字节码。

也就是一个负责读入,一个负责改造,改造之后还有一个负责输出出去。

ASM给我们提供了ASMifier工具来帮助开发,可使用ASMifier工具生成ASM结构来对比。

ASMifier工具演示

引入ASM的jar包和util包, 之后就可以编写代码了。我们先编写下面简单的Java代码,想要统计方法执行的时间:

接下来在命令行中用ASMifier工具生成一下。

 回车后会生成一堆东西,帮我们把操作字节码的代码写好。

那有了这么多东西该怎么用呢,我们又想改造成什么样子呢?

我们先把改造的代码写一下,然后再通过ASMifier工具生成一下,就可以对比两次生成的ASM结构有什么不同:

 对比后发现,修改后的代码的ASM结构分别在两处加了一堆东西。

编写我们自己的ClassVisitor

这个工具提供的代码命令可以直接粘进咱们代码中,十分省力。 

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

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

相关文章

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter) 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

林更新博士之路星途璀璨再启航

林更新:博士之路,星途璀璨再启航在这个充满机遇与挑战的时代,有一位演员以其出色的演技和不懈的努力,赢得了无数观众的喜爱。他,就是林更新。今日,一条消息如重磅炸弹般在娱乐圈炸开,让无数粉丝…

jenkins部署想定报错

报错: 解决办法: 登录被编译的设备,清楚旧代码,在重新执行

Dbeaver network unavailable due to certificate issue

场景:出现在DBeaver连接数据库下载驱动的时候 解决: 别勾选就可以了

Mac YOLO V9推理测试(基于ultralytics)

环境: Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 使用YOLO一般都会接触ultralytics这个框架,今天来试试用该框架进行YOLO V9模型的推理。 YOLOv9目前提供了四种模型下载:yolov9-c.pt、yolov9-e.pt、gelan-c.p…

LTD273次升级 | 抖音小程序新增多种支付方式 • 用户余额充值支持AsiaPay • 社区问答FAQ可设置推荐内容

1、抖音小程序接入支付功能; 2、充值增加AsiaPay海外支付; 3、商品分类列表页面URL支持分类链接; 4、用户社区求助内容支持设置推荐; 5、已知问题修复与优化; 01 商城 1) 新增抖音支付功能 本次升级我们为抖音小…

一个开源即时通讯源码

一个开源即时通讯源码 目前已经含服务端、PC、移动端即时通讯解决方案,主要包含以下内容。 服务端简介 不要被客户端迷惑了,真正值钱的是服务端, 服务是采用Java语言开发,基于spring cloud微服务体系开发的一套即时通讯服务端。…

使用map类型的参数在mapper.xml中使用案例

使用map类型的参数在mapper.xml中使用案例 简介:在常见的开发中,对于参数的装载一般使用map类型方式,这样可以避免创建很多参数实体类,不管嵌套多层的数据参数都可以通过map拿取,对于嵌套多层的map,我们需…

day-33 收集垃圾的最少总时间

思路 利用一个二维数组(数组行数为3,分别对应三种垃圾)记录垃圾数量,arr[0][i]表示第i个房子的金属、纸和或玻璃垃圾。 解题方法 将三种垃圾数量(值与时间相同)相加,最后对应垃圾车最远需要走到…

stm32f103c8t6之4x4矩阵按键

基于普中精灵开发板 1、矩阵按键原理 当我们需要使用较多的按键时,单片机的IO口可能不够用,这是就需要使用矩阵按键。 对应IO口如下: 步骤解析: 1、全部按键都没有按下时,全行IO为低电平(全列对应的IO设置为下拉低…

免费SSL证书有效期现状

自2024年4月25日起,腾讯云上申请的免费SSL证书有效期将从原先的12个月调整为3个月。而在其他平台,比如Gworg,已经有策略表明将停止签发1年期的免费SSL证书,转而仅提供有效期为3个月的证书。 目前,免费SSL证书的有效期…

docker(三):常用命令

0、启动命令 1、启动docker systemctl start docker2、停止docker systemctl stop docker3、重启docker: systemctl restart docker4、查看docker状态 systemctl status docker5、开机启动: systemctl enable docker6、查看docker概要信息 docker…