美文网首页
Java复制对象的非空属性到另外一个对象,包含内部类的属性,不复

Java复制对象的非空属性到另外一个对象,包含内部类的属性,不复

作者: Soul1010 | 来源:发表于2020-09-12 11:37 被阅读0次

    网上能找到的复制对象几乎都不包含内部类的属性复制,要么不复制内部类,要么直接把内部类的对象复制过去,但是需求如果是要复制内部类中的非空属性那就不行了,所以自己写了套,兼容了非空字段以及内部类

        /**
         * 覆盖from对象上的所有属性到to对象上,兼容内部类,如果属性为null则不覆盖
         *
         * @param from 要复制的对象
         * @param to   目标对象
         */
        public Object copyPropertiesExclude(Object from, Object to) {
            Class fromClass = from.getClass();
            Class[] innerClazz = fromClass.getDeclaredClasses();
            Field[] fields = fromClass.getFields();
            try {
                for (Field field : fields) {
                    Object fromObj = field.get(from);
                    if (fromObj == null) continue;
                    Object toObj = field.get(to);
                    String fieldStr = field.toString();
                    String[] fieldArray = fieldStr.split("\\.");
                    String fieldString = fieldArray[fieldArray.length - 1];
                    //field是基本类型的直接赋值
                    if (isBaseType(field.getGenericType().toString())) {
                        field.set(to, fromObj);
                    } else {
                        //field跟innerclass的顺序不一致,不能按照下标对比,只能判断最后一位的类名相同
                        for (Class fromInner : innerClazz) {
                            String[] innerClassArray = fromInner.toString().split("\\$");
                            String classStr = innerClassArray[innerClassArray.length - 1];
                            if (fieldString.toLowerCase().equals(classStr.toLowerCase())) {
                                //内部类的field列表
                                Field[] fromFields = fromInner.getFields();
                                for (Field fromField : fromFields) {
                                    //基本类型或者string类型直接赋值,否则循环遍历类中的属性,只对基本类型赋值
                                    if (!isBaseType(fromField.getGenericType().toString())) {
                                        if (fromField.get(fromObj) != null) {
                                            copyPropertiesExclude(fromField.get(fromObj), fromField.get(toObj));
                                        }
                                    } else {
                                        Object value = fromField.get(fromObj);
                                        if (value != null) {
                                            fromField.set(toObj, value);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return to;
        }
    
        /**
         * 判断属性是否为基本类型
         * 包括8种基本类型,和string,list,map类型的也直接覆盖
         * @return
         */
        private boolean isBaseType(String type) {
            if (type.equals("class java.lang.Integer") ||
                    type.equals("class java.lang.Byte") ||
                    type.equals("class java.lang.Long") ||
                    type.equals("class java.lang.Double") ||
                    type.equals("class java.lang.Float") ||
                    type.equals("class java.lang.Character") ||
                    type.equals("class java.lang.String") ||
                    type.equals("class java.lang.Short") ||
                    type.equals("class java.lang.Boolean") ||
                    type.startsWith("java.util.List") ||
                    type.startsWith("java.util.HashMap")) {
                return true;
            }
            return false;
        }
    

    相关文章

      网友评论

          本文标题:Java复制对象的非空属性到另外一个对象,包含内部类的属性,不复

          本文链接:https://www.haomeiwen.com/subject/kehwektx.html