zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15762273.html
Copyright © 2011-2022 走看看