Javassist 字节码学习 HelloWorld,看到这样的代码就觉得自己会了
一、前言
在字节码编程方面有三个比较常见的框架;ASM、byte-buddy、Javassist,他们都可以对这字节码进行操作,只是操作方式和控制粒度不同。
其中 ASM 更偏向于底层,需要了解 JVM 虚拟机中指定规范以及对局部变量以及操作数栈的知识。虽然在编写起来比较麻烦,但是它也是性能最好功能最强的字节码操作框架。常见的会用在 CGLIB 动态代理类中,以及一些非入侵的探针监控场景中。
另外两个框架都是有强大的 API,操作使用上更加容易控制。虽然对对比上会比 ASM 性能差一些,但不是说性能完全不好。同样在一些监控场景中也用的非常多。如果你细心可以在你的工程 jar 包搜索一下。
在这之前我已经编写了 Javaagent全链路监控 和 ASM 的部分文章,虽然这部分技术内容在 CRUD 开发中并不常用,但随着自动化测试、非入侵监控的大量使用,还是蛮多人需要这样的技能学习的。同时我也是这样一个技能的学习者,为此后面会陆续编写和完善关于 字节码编程 这个专栏。也希望这个专栏在提升自己技术栈的同时也帮助他人成长。
那么,小傅哥计划从 Javassist 到 ASM 陆续完成整套专栏学习的文章编写。从简单入门到应用操作,一步步来完成成体系的技术知识栈学习。
好!,现在开始第一个Helloworld案例。相关源码可以通过关注 公众号:bugstack虫洞栈 获取
二、开发环境
- JDK 1.8.0
- javassist 3.12.1.GA <dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
<type>jar</type>
</dependency>
三、案例目标
不看实现过程的话,我们的案例目标其实很简单,就是使用 javassist 输出一行 Helloworld 。这话像不像产品说的
以上的这段代码就是我们接下来需要使用字节码编程技术来实现的内容。
四、技术实现
其实输出一个 Helloworld 还是蛮简单的,主要是从这里面去学习一下 Javassist 的基本语法结构,也能为后续的学习有一个基础的概念。
javassist Helloworld
这段代码分为几块内容来实现功能,分别包括;
- 创建 ClassPool,它是一个基于HashMap实现的 CtClass 对象容器。
- 使用 CtClass,创建我们的类信息,也就是类的路径和名称。
- 接下来就是给类添加方法。包括;方法的属性、类型、名称、入参、出参和方法体的内容。
- 在方法创建好后还需要创建一个空的构造函数,每一个类都会在编译后生成这样一个构造函数。
- 当方法创建完成后,我们使用 ctClass.writeFile() 进行输出方法的内容信息。也就可以看到通过我们使用 Javassist 生成类的样子。
- 最后就是我们的反射调用 main 方法,测试输出结果。
五、测试结果
当我们执行测试的时候会输出类信息到工程文件夹下,同时会输出我们的测试结果;
1. 使用Javassist生成的类
使用Javassist生成的类,在工程文件夹下
2. 输出的测试结果
六、总结
- 关于 Javassist 的使用在完整的且强大的 API 下,确实还是蛮容易使用的。并且代码的使用上并不是很难理解。
相关文章
- 再获权威认证!腾讯云智能入选《IDC MarketScape:2022全球通用计算机视觉厂商评估》
- eAccelerator与phpMyAdmin冲突造成页面空白的解决办法
- 2022-12-27:etcd是无界面的,不好看,joinsunsoft/etcdv3-browser是etcd的web可视化工具之一。请问在k3s中部署,ya
- linux无界面(headless)使用selenium抓取数据
- vivo 全球商城:订单中心架构设计与实践
- 发布会直播技术及业务实践
- vivo 商城架构升级-SSR 实战篇
- vivo 微服务 API 网关架构实践
- SPI 在 Dubbo中 的应用
- Sentinel 是如何做限流的
- 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用
- vivo 全球商城:从 0 到 1 代销业务的融合之路
- vivo 全球商城:架构演进之路
- 当我们谈前端性能的时候,我们谈的是什么
- 分布式搜索引擎 Elasticsearch 的架构分析
- 异步编程之事件循环机制
- Seata是什么?一文了解其实现原理
- Canal 组件简介与 vivo 帐号实践
- 源码深度解析 Handler 机制及应用
- 彻底搞懂 IO 底层原理