`
465272694
  • 浏览: 51726 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

对象拷贝,用于更新时

    博客分类:
  • java
阅读更多
import org.apache.log4j.Logger;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.AccessController;
import java.security.PrivilegedAction;

public class ObjectCopyUtils {

    private static Logger logger = Logger.getLogger(ObjectCopyUtils.class.getName());
    private static Object source;
    private static Object target;
    private static ObjectCopyType objectCopyType;

    public enum ObjectCopyType{
        SOURCE_NOT_NULL,
        TARGET_IS_NULL,
        ALL
    }

    private ObjectCopyUtils(){

    }

    /**
     * @param paramSource 源对象
     * @param paramTarget 目标对象
     * @param paramObjectCopyType 操作类型 0: 如果源对象的当前i的属性的值不为null,才copy过去. 1:如果目标对象的当前i的属性的值为null,才copy过去.2.默认,所有都copy过去
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    public static void copyProperties(Object paramSource, Object paramTarget, ObjectCopyType paramObjectCopyType){
        source = paramSource;
        target = paramTarget;
        objectCopyType = paramObjectCopyType;
        if(source==null || target==null || objectCopyType==null){
            return;
        }

        AccessController.doPrivileged(
                new PrivilegedAction() {   //NOSONAR
                    public Object run() {
                        Class objClass = source.getClass();
                        Class tarClass = target.getClass();

                        // 通过target对象的class到obj的class中逐个扫描有无相同的field类型
                        Field[] tarFields = tarClass.getDeclaredFields();
                        for(int i=0; i<tarFields.length; i++){
                            String fieldName = tarFields[i].getName();
                            try {
                                Field objField = objClass.getDeclaredField(fieldName);

                                objField.setAccessible(true);
                                tarFields[i].setAccessible(true);

                                Object sourceValue = objField.get(source);
                                Object tarValue = tarFields[i].get(target);

                                if(tarFields[i].getModifiers() >= Modifier.FINAL){
                                    continue; //final 属性不能修改
                                }

                                switch (objectCopyType){
                                    case SOURCE_NOT_NULL:
                                        //如果源对象的当前i的属性的值不为空,才复制过去.
                                        if(sourceValue != null){
                                            tarFields[i].set(target, sourceValue);
                                        }
                                        break;
                                    case TARGET_IS_NULL:
                                        //如果目标对象的当前i的属性的值为空,才复制过去.
                                        if(tarValue == null){
                                            tarFields[i].set(target, sourceValue);
                                        }
                                        break;
                                    default:
                                        //所有复制过去
                                        tarFields[i].set(target, sourceValue);
                                        break;
                                }
                            } catch (Exception e) {     //NOSONAR
                                logger.error("ObjectCopyUtils.class copyProperties error" , e);
                                continue;
                            }
                        }
                        return  null;
                    }
                });
    }
}
 
分享到:
评论

相关推荐

    Domain对象拷贝工具类

    用于两个domain对象的拷贝,支持字段自动覆盖,选择性覆盖,选择性字段拷贝,作用:当你有多个domain对象都需要生成另外的同一个domain对象的时候这个方法就很有用了,或许存在BUG,欢迎指出

    C++类对象的拷贝构造函数

    C++类对象的拷贝构造函数 C++类对象的拷贝构造函数是一种特殊的构造函数,用于完成类对象之间的复制过程。...这样,当我们创建一个新的对象 B,并用对象 A 初始化它时,拷贝构造函数就会被调用,并完成深拷贝的过程。

    C++类对象的深拷贝、浅拷贝构造函数[借鉴].pdf

    拷贝构造函数是类的一种特殊构造函数,用于将一个对象的内容复制到另一个对象中。在了解拷贝构造函数之前,首先需要了解普通对象和类对象的区别。普通对象是指基本数据类型的对象,如 int、double 等,而类对象是指...

    python浅拷贝、深拷贝

    在Python中,浅拷贝(shallow copy)和深拷贝(deep copy)是用于创建对象副本的两种常见方式。它们可以应用于不同类型的对象,如列表、字典、集合等。下面是对浅拷贝和深拷贝的描述: 浅拷贝:浅拷贝是创建一个新...

    C 程序设计课件:第14章 堆与拷贝构造函数.ppt

    本章节主要内容包括堆的概念、需要 new 和 delete 的原因、分配堆对象、拷贝构造函数、浅拷贝与深拷贝、临时对象、无名对象、构造函数用于类型转换等。 1. 关于堆 在 C++ 程序的内存格局中,堆区是动态分配的内存...

    IBM快照及卷拷贝技术文档

    当继续向基本逻辑驱动器进行I/O操作时,所有针对基本逻辑驱动器的写操作都会导致将原有数据转移到基本资料库,从而保持数据的时间点拷贝。 FlashCopy高效存储管理 FlashCopy是一种高效的、基于存储的数据...

    C++ 类的深拷贝

    (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的...

    C++程序设计课件:第14章 堆与拷贝构造函数.ppt

    拷贝构造函数的格式是:`类名(const 类名&)`,它的参数是一个常量引用,用于将一个对象的内容复制到另一个对象中。 5. 默认拷贝构造函数 默认拷贝构造函数是一种特殊的拷贝构造函数,它是编译器自动生成的。默认...

    C++ 课程作业 类与对象2——构造函数、拷贝构造函数、析构函数(计算两个日期间的天数)

    3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...

    详解C++ 拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给...

    VisualC++面向对象程序设计教程与实验(第二版)清华大学出版社第3章习题参考答案.pdf

    * 拷贝构造函数是一种特殊的构造函数,用于将一个已有的对象初始化另一个同类对象。 * 拷贝构造函数的形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。 * 系统在以下四种情况下自动...

    c++面向对象考试题即答案

    拷贝初始化构造函数是一种特殊的构造函数,它用于初始化对象时拷贝其他对象的值,例如 `MyA(const MyA& other)`。 4. 内联函数(选择题 4)。 内联函数是一种特殊的函数,它可以在编译时将函数体展开到调用处,以...

    堆与拷贝构造函数PPT学习教案.pptx

    堆是C++程序中的内存区域之一,用于存储动态分配的对象。堆的使用需要new和delete关键字来管理内存的分配和释放。本文将详细介绍堆的概念、堆的分区、new和delete的机制、拷贝构造函数的概念和实现。 4.1 关于堆 ...

    2023年面向对象程序设计实验指导书实.doc

    拷贝构造函数用于对象间互相赋值时自动调用的。拷贝构造函数的定义格式:类名([const] 类名 &对象名){ 拷贝构造函数体 } 拷贝构造函数的调用:目的对象名=源对象名; 目的对象名(源对象名); 四、对象数组和对象...

    实验5 类和对象应用.doc

    * 拷贝构造函数的特点:用于依据已存在的对象建立一个新对象 * 拷贝构造函数的分类:浅拷贝和深拷贝 六、析构函数 * 析构函数的定义:特殊的成员函数,用于释放对象的内存空间 * 析构函数的特点:功能与构造函数...

    Delphi中的流式对象

    Delphi 中的流式对象是面向对象技术的重要组成部分,用于管理对象式数据。 Delphi 应用程序完全是由部件来构造的,因此开发高性能的 Delphi 应用程序必然会涉及对象式数据管理技术。 Delphi 的核心是部件,部件是...

    IBM 存储产品 FlashCopy(快照)及VolumeCopy(卷拷贝)功能介绍.docx

    VolumeCopy 可以创建卷拷贝,指的是完成数据对象在某一时间点的静态映像。VolumeCopy 的主要特点是可以减少对服务器周期和 I/O 资源的需求,并且可以用于进行快速数据库备份和恢复。 FlashCopy 和 VolumeCopy 是 ...

    浙江大学面向对象程序设计OOP.pdf

    拷贝构造函数是用于将一个对象拷贝到另一个对象的构造函数。赋值运算符是用于将一个对象赋值给另一个对象的运算符。浅拷贝和深拷贝是两种不同的拷贝方式。浅拷贝只是将对象的指针拷贝过去,而深拷贝则会将对象的内容...

    c++类和对象练习题.doc

    "c++类和对象练习题.doc" 以下是c++类和对象相关知识点的详细解释: ...析构函数是在对象释放时自动调用的,用于释放对象占用的资源。析构函数的调用顺序是与对象的创建顺序相反的,即最后创建的对象最先被释放。

    Java面向对象考试常考简答题.docx

    包括对象的定义和使用、static修饰的应用、final修饰的使用、重载的实现、基于抽象类和接口的重写、包的定义、类的导入、类的权限、类中成员权限、异常处理机制、线程构造、点击按钮事件的处理、文件的拷贝和序列化/...

Global site tag (gtag.js) - Google Analytics