• Hutool的BeanUtil.copyProperties() 的改进详情


    1.

    Hutool是一个Java开发工具包,提供了丰富而实用的工具方法。其中的BeanUtil类提供了一系列用于JavaBean属性操作的方法,包括copyProperties()方法。

    Hutool的BeanUtil.copyProperties()方法用于将源对象的属性值复制到目标对象中相应的属性。该方法能够自动识别源对象和目标对象的属性名和类型,并进行适当的类型转换。

    使用Hutool的BeanUtil.copyProperties()方法需要注意以下几点:

    1.属性名和数据类型必须在源对象和目标对象之间匹配。
    2.如果属性名不一致,会自动进行属性映射。
    3.支持嵌套对象的属性复制。
    4.支持集合属性的复制。
    5.默认情况下,如果源对象的属性值为null,不会复制到目标对象中,目标对象的属性值保持不变。
    示例代码如下所示:

    // 导入BeanUtil类
    import cn.hutool.core.bean.BeanUtil;
    
    // 创建源对象和目标对象
    SourceObject source = new SourceObject();
    TargetObject target = new TargetObject();
    
    // 使用BeanUtil.copyProperties()方法进行属性复制
    BeanUtil.copyProperties(source, target);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2.

    在Hutool工具包的BeanUtil.copyProperties()方法中,如果源对象的属性在目标对象中不存在,会被忽略,不会引发异常。换句话说,只有在目标对象已经存在对应的属性时,才会进行属性值的复制。

    如果源对象的属性在目标对象中不存在,BeanUtil.copyProperties()方法会跳过该属性,并继续复制其他匹配的属性。目标对象的属性值将保持不变,不会被修改。

    这种行为使得属性复制更加灵活,你可以只复制源对象和目标对象之间相同的属性,并且不需要担心目标对象缺少一些属性。

    以下是一个示例代码:

    import cn.hutool.core.bean.BeanUtil;
    
    // 创建源对象和目标对象
    public class SourceObject {
        private String name;
        private int age;
    
        // 省略getter和setter方法
    }
    
    public class TargetObject {
        private String name;
    
        // 省略getter和setter方法
    }
    
    // 创建源对象
    SourceObject source = new SourceObject();
    source.setName("John");
    source.setAge(25);
    
    // 创建目标对象
    TargetObject target = new TargetObject();
    
    // 使用BeanUtil.copyProperties()方法进行属性复制
    BeanUtil.copyProperties(source, target);
    
    // 输出目标对象的属性值
    System.out.println(target.getName());  // 输出 "John"
    
    
    • 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

    在上面的示例中,源对象source有两个属性"name"和"age",而目标对象target仅有一个属性"name"。尽管源对象有"age"属性,但由于目标对象缺少该属性,所以在属性复制过程中会被忽略。

    总结起来,如果源对象的属性在目标对象中不存在,Hutool的BeanUtil.copyProperties()方法会跳过该属性,不会对目标对象产生影响。

    3.

    在Hutool工具包的BeanUtil.copyProperties()方法中,如果源对象和目标对象的属性名不一致,会进行自动的属性映射。自动属性映射是指当属性名不匹配时,会根据一定的规则尝试找到对应的属性进行复制。

    Hutool根据以下规则进行属性映射:

    首先,会尝试将源对象的属性名与目标对象的属性名进行完全匹配。如果能够找到匹配的属性名,则进行属性值的复制。

    如果完全匹配失败,Hutool会尝试将源对象的属性名转换为目标对象属性名的驼峰命名方式进行匹配。例如,如果源对象有一个属性名为"first_name",而目标对象有一个属性名为"firstName",则这两个属性会被匹配并进行复制。

    如果驼峰命名方式的匹配也失败,Hutool会尝试使用其它常见的命名规则,如下划线转驼峰等,进行属性名的匹配。

    需要注意的是,自动属性映射是有限制的:

    只有在源对象和目标对象的属性类型兼容时,才会进行属性值的复制。
    如果目标对象的属性为只读或只写,无法进行属性值的复制。
    自动属性映射是有限的,可能无法处理过于复杂的属性名映射情况,此时需要手动进行属性值的复制。
    以下是一个示例代码:

    import cn.hutool.core.bean.BeanUtil;
    
    // 创建源对象和目标对象
    public class SourceObject {
        private String firstName;
        private int age;
    
        // 省略getter和setter方法
    }
    
    public class TargetObject {
        private String name;
        private int age;
    
        // 省略getter和setter方法
    }
    
    // 创建源对象
    SourceObject source = new SourceObject();
    source.setFirstName("John");
    source.setAge(25);
    
    // 创建目标对象
    TargetObject target = new TargetObject();
    
    // 使用BeanUtil.copyProperties()方法进行属性复制
    BeanUtil.copyProperties(source, target);
    
    // 输出目标对象的属性值
    System.out.println(target.getName());  // 输出 "John"
    System.out.println(target.getAge());   // 输出 25
    
    
    • 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

    在上面的示例中,源对象source有两个属性"firstName"和"age",而目标对象target有一个属性"name"和"age"。根据自动属性映射的规则,"firstName"将会被映射到"name"属性中,并进行属性值的复制,"age"属性名完全匹配,也进行了属性值的复制。

    总结起来,当源对象和目标对象的属性名不一致时,Hutool的BeanUtil.copyProperties()方法会尝试根据一定的规则进行自动的属性映射。通过合理命名,可以实现更加方便和灵活的属性复制操作。

  • 相关阅读:
    matlab预测股票价格走势
    RabbitMQ常用命令
    【react hook】react hook组件中,在forEach中使用async/awati进行异步操作,为什么后面代码没有等待直接同步运行了呢?
    小型洗衣机什么牌子好又便宜?内衣洗衣机推荐
    最小步数
    【Python入门】Python入门必备思维导图,有方向的学习才是最实在的方法
    node_modules/XXX/index.js:XXX;XX ||= XXX?.[level];SyntaxError: Une
    实用篇-Ribbon负载均衡
    crossover23.6闪亮登场发布啦,2023最新功能解析
    redis常见面试题
  • 原文地址:https://blog.csdn.net/tianynnb/article/details/132739798