• 动态创建类- 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);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这里我们动态的创建了一个叫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;
    
    /**
     * 类工厂
     * @Author: Herche Jane
     * @Date: 2023/10/26
     */
    public interface ClassFactory {
    
        /**
         * 创建一个类
         * @param className 类名
         * @param subClass 父类名
         * @param interfaces 实现接口
         * @param annotations 注释描述
         */
        public DynamicType.Builder<?> createClass(String className, Class subClass, String[] interfaces, AnnotationDescription[] annotations);
    
    
        /**
         * 创建类
         * @param className 类名
         * @param subClass 父类名
         */
        public DynamicType.Builder<?> createClass(String className, Class subClass);
    
    
        /**
         * 创建一个类
         * @param className 类名
         * @param subClass 父类名
         * @param annotations 注释描述
         */
        public DynamicType.Builder<?> createClass(String className, Class subClass, AnnotationDescription[] annotations);
    
    
        /**
         * 创建一个类
         * @param className 类名
         * @param interfaces 接口名
         * @param annotations 注释描述
         */
        public DynamicType.Builder<?> createClass(String className,  String[] interfaces, AnnotationDescription[] annotations);
    
    
        /**
         * 创建一个类
         * @param className 类名
         * @param interfaces 接口名
         */
        public DynamicType.Builder<?> createClass(String className,  String[] interfaces);
    
    
        /**
         * 创建一个类
         * @param className 类名
         */
        public DynamicType.Builder<?> createClass(String className);
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    这是一个类工厂,用于创建一个类,类可以定义类名,父类名,实现接口名,注解描述等类的基本特性,用来自动创建类,然后我们有一个执行接口。其中只要一个方法 叫做 execute 即可。然后我们把这个类置于容器中,然后可以对这个类进行赋值等操作。

    结果

    ByteBuddy动态创建类非常的方便快捷,对我们的动态生成接口非常有帮助。

  • 相关阅读:
    关于c++中成员函数做友元的详细解释
    .Net 7内容汇总(3)--反射优化
    Dapr 助力应用架构的可持续性
    微信小程序接口请求/form-data/单文件、多文件上传
    @Accessors 注解详解
    【代码实践】HAT代码Window平台下运行实践记录
    水果店圈子:开个水果店需要什么手续,想开一家水果店需要哪些条件
    在搭载 M1 及 M2 芯片 MacBook 设备上玩 Stable Diffusion 模型
    【2023研电赛】兆易创新命题三等奖: 低成本单母线电流永磁同步无感驱动器
    企业出海打造爆款游戏,需要什么样的云服务?
  • 原文地址:https://blog.csdn.net/weixin_45487988/article/details/134071152