`
465272694
  • 浏览: 52506 次
  • 性别: 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;
                    }
                });
    }
}
 
分享到:
评论

相关推荐

    C#基于表达式(Expression)实现对象深拷贝

    在C#编程中,对象的深拷贝是一个重要的概念,特别是在处理复杂的数据结构时,我们需要确保复制的对象与原对象在内存中是独立的,修改其中一个不会影响另一个。本主题将详细探讨如何使用C#的表达式(Expression)来...

    Domain对象拷贝工具类

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

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

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

    JavaScript对象拷贝与Object.assign用法实例分析

    JavaScript中的对象拷贝是编程中常见的操作,尤其在处理复杂数据结构时显得尤为重要。对象拷贝分为两种主要类型:浅拷贝和深拷贝。 浅拷贝是指创建一个新对象,新对象的属性引用了原对象中属性的引用。这意味着,当...

    C#中的浅拷贝和深拷贝

    ### C#中的浅拷贝与深拷贝 ...浅拷贝通常用于不需要完全复制对象内部所有成员的情况,而深拷贝则适用于需要完全独立的复制版本的情况。在实际开发过程中,根据具体需求选择合适的拷贝方式是非常重要的。

    ios-深拷贝对象.zip

    其中,深拷贝是数据持久化过程中的一个关键概念,特别是在处理复杂对象时,确保对象的独立性与原始数据的完整性。本资料“ios-深拷贝对象.zip”可能包含了关于如何在Objective-C或Swift中实现深拷贝的实践示例,特别...

    深拷贝拷贝的是内容,浅拷贝拷贝的是指针

    - **定义**:深拷贝是指在进行对象复制时,不仅复制了对象本身,还会复制该对象内部指向的所有数据。 - **特点**: - 源对象和新对象完全独立,即使其中一个对象发生了改变也不会影响另一个对象。 - 对于包含引用...

    java不同对象及集合的多次复制

    模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码的重要手段。本主题将深入探讨如何使用注解实现不同对象、相同对象以及集合与集合之间的多次...

    拷贝JSON对象值进Java Bean对象

    在Java编程中,将JSON对象转换为Java Bean对象是一个常见的任务,特别是在处理Web服务或API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而Java Bean是符合特定规范的Java类,通常用于...

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

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

    C++之深拷贝和浅拷贝

    在C++编程语言中,拷贝构造函数是类的一个特殊的构造函数,它用于创建一个新对象作为现有对象的副本。拷贝构造函数可以执行浅拷贝或深拷贝。浅拷贝是按位拷贝成员,这可能会导致共享数据导致的错误。深拷贝则创建了...

    C++类对象的深拷贝、浅拷贝构造函数.doc

    拷贝构造函数是一种特殊的构造函数,它用于初始化一个新对象作为现有对象的副本。 首先,让我们解释一下浅拷贝(Shallow Copy)。默认情况下,C++的拷贝构造函数执行浅拷贝,这意味着成员变量(包括指针)的值会被...

    4_深拷贝,浅拷贝,临时对象1

    1. **对象作为值传递给函数参数**:当我们将类对象作为参数传递给函数时,编译器会创建一个临时对象,然后使用拷贝构造函数复制实参对象的值到这个临时对象中。 2. **对象通过另一个对象进行初始化**:当我们用一个...

    python浅拷贝、深拷贝

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

    【JavaScript源代码】详解jQuery的拷贝对象.docx

    在前端开发中,对象拷贝是一项常用的操作,尤其是在处理数据更新、避免数据污染等场景时。jQuery 提供了一套简便的方法来实现对象拷贝,即 `$.extend()` 方法。本文将详细介绍 jQuery 中如何使用 `$.extend()` 进行...

    深拷贝浅拷贝.zip

    总的来说,浅拷贝适用于数据结构简单且不包含复杂引用的对象,而深拷贝则用于需要确保新对象和原始对象完全独立的情况。在编写C#程序时,理解这两种拷贝方式的区别对于避免意外的数据修改至关重要。在实际项目中,...

    python对象比较、拷贝、参数传递.zip

    二、Python对象拷贝 在Python中,对象的拷贝分为浅拷贝(shallow copy)和深拷贝(deep copy)。 1. 浅拷贝:通过`copy()`函数或`[:]`切片操作创建新对象,只拷贝对象的表面层次。如果原对象包含可变对象(如列表...

    对浅拷贝、深拷贝、写时拷贝的简单认识

    总结起来,浅拷贝、深拷贝和写时拷贝都是在处理对象拷贝时考虑的重点。理解它们的差异和适用场景是编写高效、安全的代码的关键。在实现涉及资源管理的类时,应确保正确处理拷贝构造函数、赋值运算符重载以及析构函数...

    拷贝构造函数

    拷贝构造函数是C++编程语言中的一种特殊的构造函数,它用于初始化一个类的对象时拷贝另一个对象的内容。拷贝构造函数的存在是为了满足在C++中对象的复制需求,它可以在三个情况下被自动调用:第一种情况是当用类的一...

Global site tag (gtag.js) - Google Analytics