美文网首页
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复制对象的非空属性到另外一个对象,包含内部类的属性,不复

    网上能找到的复制对象几乎都不包含内部类的属性复制,要么不复制内部类,要么直接把内部类的对象复制过去,但是需求如果是...

  • 深复制与浅复制

    浅复制 浅复制就是,直接把一个对象(源对象)的属性复制到另一个对象(目标对象)中,当然,如果当属性中包含引用类型的...

  • Java的内部类

    1)概念:类中的类就是内部类,作为一个属性(对象属性或类属性); 2.1)内部类对象属性及使用 内部类对象属性的定...

  • 浅拷贝与深拷贝NSMutableCopy、NScopy

    1.浅拷贝和深拷贝的区别 浅拷贝只是复制对象本身,对象属性包含的对象不复制,不产生新对象,直接指向原有对象。 深拷...

  • JavaScript 的深拷贝与浅拷贝

    一、浅拷贝 拷贝-复制, 将一个对象的属性和方法复制到另一个对象上, 只复制一层,如果属性是对象,复制对象的地址。...

  • ES6 ---- 对象

    对象中属性名可以简写 对象中的方法简写 对象的合并将源对象的所有 可枚举属性 复制到目标对象 属性的遍历for ....

  • clone()之浅拷贝与深拷贝

    简述 我们在Java开发时,有时会涉及到对象拷贝复制,就是将一个对象的所有属性(成员变量)复制到另一个对象中,而拷...

  • Java中的POJO、VO、DTO、PO、DO、BO、DAO

    1、POJO(Plain Ordinary Java Object)普通的Java对象,只包含若干属性和属性的se...

  • 深浅复制

    深浅复制和属性为copy,strong值的变化问题 浅复制:只复制指向对象的指针,而不复制引用对象本身。对于浅复制...

  • 内部类

    内部类 1.可以访问访问其外部类所有属性和方法,无需创建外部类对象 2.必须创建内部类对象,否则无法从外部类访问内...

网友评论

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

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