• Java基础知识18Java Bean间属性值的复制(BeanUtils使用)


    需求:两个对象中有相同类型相同名称的属性,把一个对象中的属性值复制到另一个对象。

    方法1:

    org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object);

    该方法只能对一个bean中普通属性字段进行copy,如果这个bean中有其他的bean,即bean中bean,就需要将其值取出,单独对这个子bean进行copy,然后set进父bean,这种copy如果在bean层次少的时候还无所谓,如果在bean的层次比较深的时候,就会发现很是繁琐了

    方法2:

    实体类:

    Customer类

    /**
     * @Author lucky
     * @Date 2022/1/4 10:28
     */
    @Slf4j
    @Builder
    @Data
    public class Customer {
        private String name;
        private int age;
        private String gender;
        private Map<String,String> params;
        private Map<String,String> heads;
    }

    User类:

    @Data
    @Builder
    @Slf4j
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private String name;
        private int age;
        private String gender;
        private Map<String,String> params;
    }

    工具类:

    /**
     * @Author lucky
     * @Date 2022/1/4 10:14
     */
    @Slf4j
    public class BeanCopyUtils {
        public static <T> void beanCopyProperties(T src, T dest){
            Map<String,Object> properties=new HashMap<>();
            Arrays.stream(src.getClass().getDeclaredFields()).forEach((field -> {
                try {
                    field.setAccessible(true);
                    properties.put(field.getName(), field.get(src));
                } catch (IllegalAccessException e) {
                    //log.error("",e );
                }
            }));
            populateBean(dest,dest.getClass(),properties);
            populateBean(dest,dest.getClass().getSuperclass(),properties);
        }
    
        private static <T> void populateBean(T bean,Class clazz,Map<String,Object> properties){
            Arrays.stream(clazz.getDeclaredFields()).forEach((field -> {
                try {
                    field.setAccessible(true);
                    //如果非空,覆盖原有值;如果为空,则不覆盖原有值
                    if(properties.get(field.getName())!=null){
                        field.set(bean,properties.get(field.getName()));
                    }
    
                } catch (IllegalAccessException e) {
                    //log.error("",e);
                }
            }));
        }
    
        public static void main(String[] args) {
            Map<String,String> params=new HashMap<>();
            params.put("userInfo","ttbank 2021");
            Customer customer = Customer.builder().age(26).gender("man").params(params).build();
            //01 使用自己创建的工具类
            User user=new User();
            user.setName("lucky");
            beanCopyProperties(customer, user);
            System.out.println(user);
            params.put("userInfo","ttbank 2022");
            System.out.println(user);
            System.out.println(customer);
    
            //02 使用工具类BeanUtils
            User user2=new User();
            BeanUtils.copyProperties(customer,user2);
            System.out.println(user2);
        }
    }

    控制台输出:

    User(name=lucky, age=26, gender=man, params={userInfo=ttbank 2021})
    User(name=lucky, age=26, gender=man, params={userInfo=ttbank 2022})
    Customer(name=null, age=26, gender=man, params={userInfo=ttbank 2022}, heads=null)
    User(name=null, age=26, gender=man, params={userInfo=ttbank 2022})

     参考文献:

    https://blog.csdn.net/qq_37276508/article/details/102366097

  • 相关阅读:
    SpringBoot进入debug模式
    windows上安装ElasticSearch
    Python操作Redis
    JVM: OOP模型 & 对象内存结构 & 计算对象大小 & 指针压缩 & 预估调优
    JVM:执行引擎&JIT&逃逸分析
    man -k或apropos报nothing appropriate解决办法
    JVM:String底层
    JVM: 内存模型
    JVM: 字节码解析
    mac不能启动finder的解决方案
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15762273.html
Copyright © 2020-2023  润新知