ByteBuddy字节码增强器

Byte Buddy是java的字节码增强器,一个优雅的运行时java代码生成库,使用时需要慎重

文档地址:http://bytebuddy.net/#/tutorial-cn

1. 引入ByteBuddy

 <!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy --><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy</artifactId><version>1.14.17</version></dependency>

2. ByteBuddy学习

2.1 类的创建

任何类的实例创建都是从ByteBuddy的实例开始

DynamicType.Unloaded<Object> dynamicType = new ByteBuddy().subclass(Object.class)// 增强方式:目标类生成子类.name("example.Type") // 自定义生成的类名:包名+类名.make();// 编译生成该类

2.2 指定类的包名

 DynamicType.Unloaded<?> dynamicType = byteBuddy.with(new NamingStrategy.AbstractBase() {@Overrideprotected String name(TypeDescription superClass) {return "example." + superClass.getSimpleName(); // 可自定义包名和类型}}) .subclass(Object.class).make();

2.3 类的保存

DynamicType.Unloaded<Object> dynamicType = new ByteBuddy()
dynamicType.saveIn(new File("文件路径"));// 将类Class文件保存文件夹

2.4 类的注入

可以将动态的生成的类注入到指定jar包中

DynamicType.Unloaded<Object> dynamicType = new ByteBuddy()
dynamicType.inject(new File("jar"));// 将类Class文件注入到jar包中

2.5 ByteBuddy增强方式

ByteBuddy共有三种增强方式:

  • subclass:为目标类生成子类进行增强
  • rebase:当对类型变基时,Byte Buddy 会保留所有被变基类的方法实现。Byte Buddy 会用兼容的签名复制所有方法的实现为一个私有的重命名过的方法, 而不像类重定义时丢弃覆写的方法。用这种方式的话,不存在方法实现的丢失,而且变基的方法可以通过调用这些重命名的方法(目前并未发现起作用)
  • redefine:重新定义方法,会替换已存在的方法实现。

2.6 类的加载策略

ClassLoadingStrategy.Default定义了内置策略,如果不选择,系统会自动默认推导出一个策略。

WRAPPER 策略:1. 创建一个新的 ClassLoader 来加载动态生成的类型。2. 适合大多数情况,这样生产的动态类不会被ApplicationClassLoader加载到,不会影响到项目中已经存在的类。
WRAPPER_PERSISTENT:该策略与WRAPPER相同,但通过ClassLoader.getResourceAsStream(String)公开表示类的字节数组。为此,所有类文件都在包装类加载器中作为字节数组持久化。
CHILD_FIRST:创建一个子类优先加载的 ClassLoader,即打破了双亲委派模型。
CHILD_FIRST_PERSISTENT:该策略与CHILD_FIRST相同,但通过ClassLoader.getResourceAsStream(String)公开表示类的字节数组。为此,所有类文件都在包装类加载器中作为字节数组持久化。
INJECTION 策略:使用反射,将动态生成的类型直接注入到当前 ClassLoader 中。

持续学习更新中。。。

借鉴文章:https://blog.csdn.net/zhou920786312/article/details/130649115

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

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

相关文章

LeetCode---哈希表

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 代码示例&#xff1a; //时间复杂度: O(n) //空间复杂度: O(1) c…

Java生成PDF笔记整理

引入依赖, groupId:com.itextpdf, version:8.0.4, artifactId如下kernel,io,layout,forms创建pdf对象try(ByteArrayOutputStream outputStream new ByteArrayOutputStream()){PdfWriter writer new PdfWriter(outputStream, new WriterProperties().setFullCompressionMode(t…

离线安装python库

1. 下载安装包 在联网机器上安装 # 选择符合目标架构的版本&#xff0c;主要是libc版本和python版本 pip download --platformmanylinux2010_x86_64 --only-binary:all: --python-version3.7.4 tabulate # 或者 pip download --platformmanylinux_2_5_x86_64 --only-binary:a…

do...while循环

基本语法 while循环&#xff0c;是先判断条件再执行。 do...while循环&#xff0c;是先斩后奏&#xff0c;先至少执行一次循环语句块中的逻辑&#xff0c;再判断是否继续。 do {//do while 循环语句块; } while (bool类型的值);注意&#xff1a;do...while语句&#xff0c;存…

Common Lisp笔记

在计划学习函数式编程的时候&#xff0c;我一开始打算学习的是 F#。因为我朋友就是在 DTU 上的学&#xff0c;F# 就是 DTU&#xff08;丹麦理工&#xff09;开发的。但是由于 F# 和微软的 .NET 绑定&#xff0c;而在 macOS 上&#xff0c;目前版本的 .NET 的是有些问题的&#…

2020编程语言排序:探索编程界的热门与趋势

2020编程语言排序&#xff1a;探索编程界的热门与趋势 在数字时代的浪潮中&#xff0c;编程语言作为构建数字世界的基石&#xff0c;其流行度和影响力不容忽视。2020年&#xff0c;各大编程语言在各自的领域里展现出独特的魅力和实力。本文将从四个方面、五个方面、六个方面和…

线性代数|机器学习-P3乘法和因式分解矩阵

文章目录 1. 矩阵分解2. S Q Λ Q T SQ\Lambda Q^T SQΛQT3. A U Σ V T AU\Sigma V^T AUΣVT4. A LU 分解5. 矩阵的四个子空间 1. 矩阵分解 目前我们有很多重要的矩阵分解&#xff0c;每个分解对应于多个前提条件&#xff0c;分解方法&#xff0c;分解后的形状会中如下&…

【Vue】v-for中的key

文章目录 一、引入问题二、分析问题 一、引入问题 语法&#xff1a; key属性 "唯一值" 作用&#xff1a;给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用。 为什么加key&#xff1a;Vue 的默认行为会尝试原地修改元素&#xff08;就地复用&#xff09;…

马宝国和沈有容-UMLChina建模知识竞赛第5赛季第12轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

大模型备案语料来源安全要求

大模型备案的语料来源安全要求&#xff0c;对服务提供者的要求如下。 a&#xff09;语料来源管理方面&#xff1a; 1&#xff09;面向特定语料来源进行采集前&#xff0c;应对该来源语料进行安全评估&#xff0c;语料内容中含违法不良信息超过5%的&#xff0c;不应采集该来源…

R语言ggplot2包绘制网络地图

重要提示&#xff1a;数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 载入R包 rm(listls()) pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap) 网络节点和边数据 nodes <- read.csv(nodes.csv, row.names 1) edges…

【Python技术】AI编程新手快速入门学习LangChain大模型框架

如果我们要搞AI智能体&#xff0c;普通人一般 借助腾讯元器、 coze、KIMI 或者其他大平台搞一搞&#xff0c;比如我配置的coze智能体在微信公众号聊天。 对于程序员来说&#xff0c;一言不合就喜欢搞代码。 前面文章也介绍了不少关于AI知识库问答&#xff0c;AIagent 不少开源…

利用AI技术革新学习笔记整理:迈向高效学习的新时代

利用AI技术革新学习笔记整理&#xff1a;迈向高效学习的新时代 在数字化时代&#xff0c;学习方式正在经历一场革命。人工智能&#xff08;AI&#xff09;技术的融入&#xff0c;让学习笔记的整理变得更加高效、智能。本文将探讨如何利用AI整理学习笔记&#xff0c;以及这一技…

指纹采集技术

目录 1.概述 1.1 捺印油墨采集 1.2 现场指纹提取 1.3 在线指纹采集 2. 指纹采集器的关键技术指标 2.1 采集面积 2.2 分辨率 2.3 图像质量 2.4 耐用性 1.概述 最早的指纹采集技术是油墨法&#xff0c;至少已经有上百年的历史。1990年代出现了活体指纹采集器&#xff0c…

数据库(入门)

文章目录 一、数据库(DB) 二、数据库管理系统&#xff08;DBMS&#xff09; 三、SQL&#xff08;结构化查询语言&#xff09; 四、三者的关系 五、端口号&#xff08;port number&#xff09; 一、数据库(DB) 定义&#xff1a;按照一定格式存储数据的一些文件的组合。 简单来…

常用的变量命名

当命名编码中的变量时&#xff0c;清晰、简洁和具有描述性的命名是非常重要的。以下是一些常用的变量名称示例&#xff1a; 整数型变量&#xff1a; countindexnumtotalsizelength 浮点型变量&#xff1a; priceratetemperatureweightheightamount 字符串型变量&#xff1a; …

大数据测试/ETL开发,如何造测试数据

相信很多的小伙伴&#xff0c;有些是大数据测试岗位&#xff0c;有些是ETL开发&#xff0c;都面临着如何要造数据的情况。 1&#xff0c;造数背景 【大数据测试岗位】&#xff0c;比较出名的就是宁波银行&#xff0c;如果你在宁波银行做大数据开发&#xff0c;对着需求开发完…

数学建模 —— 层次分析法(2)

目录 一、层次分析法&#xff08;AHP&#xff09; 二、构造比较判断矩阵 2.1 两两比较法 三、单准则下的排序及一致检验 3.1 单准则下的排序 3.2 一致性检验 四、层次总排序 4.1 层次总排序的步骤 4.2 总排序一致性检验 一、层次分析法&#xff08;AHP&#xff09; 方…

xdp、dpdk、rdma能在同一网卡上同时使用吗?

文心一言 XDP、DPDK和RDMA是三种不同的技术&#xff0c;它们各自在Linux网络性能优化中扮演了不同的角色。关于它们能否在同一网卡上同时使用&#xff0c;我们需要考虑以下几个方面&#xff1a; XDP&#xff08;eXpress Data Path&#xff09;&#xff1a; XDP是Linux内核提供…

SVM算法-非线性分类背后技术详解

引言 支持向量机&#xff08;SVM&#xff09;是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务中。本文将详细介绍SVM算法在非线性分类任务中的应用&#xff0c;并通过代码示例来展示其背后的技术精髓。我们将分三大部分来展开&#xff0c;本部分将重点介绍SVM算…