ByteBuddy字节码增强器

2024-06-02 12:04
文章标签 字节 bytebuddy 增强器

本文主要是介绍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

这篇关于ByteBuddy字节码增强器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023915

相关文章

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

JVM - 字节码文件详解

文章目录 目录 文章目录 1. 无关性基石 2. Class类文件结构 magic- 魔数 主副版本号 常量池 访问标志 类索引,父类索引与接口索引集合 字段 方法 属性 3. 类加载机制 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 4. 类加载器 类与类加载器 类加载器的分类 启动类加载器  扩展类加载器 应用程序类加

SylixOS write 0 字节问题

1 问题描述 在移植中间件过程中,在SylixOS调用write函数写入0字节的数据到文件中时,会导致对应的中间件测试用例失败,失败的原因是文件系统中的write函数在Linux系统和SylixOS有区别,两种实现的差别如下。 2 write函数的实现机制 2.1 SylixOS实现机制 在SylixOS下通过write 函数写数据到普通文件中时,第一步会判断写入的数据是否为0,如果是0直

CPU大小端字节序的检测

机器的字节序有两种,即大端字节序和小端字节序。 大端字节序:在内存中,低地址存放数据的 高位,高地址存放数据的 低位 小端字节序:在内存中,低地址存放数据的 低位,高地址存放数据的 高位 如例:定义数据  a = 0x01020304 小端方式:01 02 03 04 大端方式:04 03 02 01 那么如何判断呢,方式如下--> 一、 指

68-java字符流和字节流

Java中的字符流和字节流是用于处理输入/输出的两大类。字符流主要用于处理字符数据,而字节流可以处理任何类型的数据。 字符流: Reader:用于读取字符流的抽象类。 Writer:用于写入字符流的抽象类。 字节流: InputStream:用于读取字节流的抽象类。 OutputStream:用于写入字节流的抽象类。 下面是使用字符流和字节流的简单示例: 字符流示例(文件复

1字节的UTF-8序列的字节1无效

使用DOMReader解析XML文档时候报错”1字节的UTF-8序列的字节1无效”,我这里的解决方法。 1.手动将< ? xml version=”1.0” encoding=”UTF-8”?>中的UTF-8更改成UTF8,这样就可以了。 2.使用文本编译器把xml文档改成以UTF8无BOM编码格式就可以了。

SparkSQL在字节跳动的应用实践和优化实战

来源:字节跳动白泉的分享 作者:大数据技术与架构整理 点击右侧关注,大数据开发领域最强公众号! 点击右侧关注,暴走大数据! By  大数据技术与架构 场景描述: 面对大量复杂的数据分析需求,提供一套稳定、高效、便捷的企业级查询分析服务具有重大意义。本次演讲介绍了字节跳动

使用Python通过字节串或字节数组加载和保存PDF文档

处理PDF文件的可以直接读取和写入文件系统中的PDF文件,然而,通过字节串(byte string)或字节数组(byte array)来加载和保存PDF文档在某些情况下更高效。这种方法不仅可以提高数据处理的灵活性,允许开发者在内存中直接操作PDF,而且还能增强安全性,同时方便跨应用传输和网络传输。 本文将介绍如何使用Python通过字节串或字节数组来加载和保存PDF文档。 文章目录 创建P