动态创建类- ByteBuddy
场景
要做一个可以动态生成接口的工具,这样可以节省大量的时间去做相同的事情,恰巧以前做过一些这方面的工作,用过ByteBuddy,所以就选择ByteBuddy来做这件事。
ByteBuddy
ByteBuddy 是一个用于生成字节码的 Java 库,用于创建和修改类以在运行时动态生成新的类或修改现有类。它有以下特性:
动态生成类: ByteBuddy 允许你在运行时动态生成新的类,这对于某些应用程序场景非常有用,如 AOP(面向切面编程)或创建代理类。
易于使用: ByteBuddy 提供了一个简单的 API,使创建和修改类变得相对容易。它的链式调用和流畅的 DSL 风格使代码更易于理解。
高性能: ByteBuddy 被设计成高性能的字节码生成库。它的生成的字节码通常比使用反射 API 手动创建类更快。
灵活性: ByteBuddy 允许你以多种方式生成类,包括从头开始创建、扩展现有类或创建代理类。这种灵活性使其适用于各种用例。
兼容性: ByteBuddy 兼容大多数 JVM(Java 虚拟机),并且可以与许多其他库和框架集成,如 Spring、Hibernate 等。
动态创建一个类
public static void main(String[] args) throws Exception { // 使用 Byte Buddy 创建一个新类 Class<?> dynamicType = new ByteBuddy() .subclass(Object.class) .name("Demo") // 定义一个名为 "field" 的字段并为其添加初始值 .defineField("field", String.class, Visibility.PUBLIC) .value("Hello, this is the value of field.") .make() .load(ByteBuddyDemo.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) .getLoaded(); // 创建一个示例对象 Object instance = dynamicType.newInstance(); // 使用反射获取字段值 String fieldValue = (String) instance.getClass().getDeclaredField("field").get(instance); System.out.println("Field Value: " + fieldValue); }
这里我们动态的创建了一个叫demo的类,这个类中有属性field,并且赋值Hello, this is the value of field,然后使用反射获取这个字段值即可,就可以直接对对象进行操作,非常方便。
领域展开
所以我写了两个接口:
package com.oceania.interfacewve.factory;import net.bytebuddy.description.annotation.AnnotationDescription;import net.bytebuddy.dynamic.DynamicType;public interface ClassFactory { public DynamicType.Builder<?> createClass(String className, Class subClass, String[] interfaces, AnnotationDescription[] annotations); public DynamicType.Builder<?> createClass(String className, Class subClass); public DynamicType.Builder<?> createClass(String className, Class subClass, AnnotationDescription[] annotations); public DynamicType.Builder<?> createClass(String className, String[] interfaces, AnnotationDescription[] annotations); public DynamicType.Builder<?> createClass(String className, String[] interfaces); public DynamicType.Builder<?> createClass(String className);}
这是一个类工厂,用于创建一个类,类可以定义类名,父类名,实现接口名,注解描述等类的基本特性,用来自动创建类,然后我们有一个执行接口。其中只要一个方法 叫做 execute 即可。然后我们把这个类置于容器中,然后可以对这个类进行赋值等操作。
结果
ByteBuddy动态创建类非常的方便快捷,对我们的动态生成接口非常有帮助。
来源地址:https://blog.csdn.net/weixin_45487988/article/details/134071152
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341