本文主要是介绍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字节码增强器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!