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#编程中,对象的深拷贝是一个重要的概念,特别是在处理复杂的数据结构时,我们需要确保复制的对象与原对象在内存中是独立的,修改其中一个不会影响另一个。本主题将详细探讨如何使用C#的表达式(Expression)来...
用于两个domain对象的拷贝,支持字段自动覆盖,选择性覆盖,选择性字段拷贝,作用:当你有多个domain对象都需要生成另外的同一个domain对象的时候这个方法就很有用了,或许存在BUG,欢迎指出
C++类对象的拷贝构造函数 C++类对象的拷贝构造函数是一种特殊的构造函数,用于完成类对象之间的复制过程。...这样,当我们创建一个新的对象 B,并用对象 A 初始化它时,拷贝构造函数就会被调用,并完成深拷贝的过程。
JavaScript中的对象拷贝是编程中常见的操作,尤其在处理复杂数据结构时显得尤为重要。对象拷贝分为两种主要类型:浅拷贝和深拷贝。 浅拷贝是指创建一个新对象,新对象的属性引用了原对象中属性的引用。这意味着,当...
### C#中的浅拷贝与深拷贝 ...浅拷贝通常用于不需要完全复制对象内部所有成员的情况,而深拷贝则适用于需要完全独立的复制版本的情况。在实际开发过程中,根据具体需求选择合适的拷贝方式是非常重要的。
其中,深拷贝是数据持久化过程中的一个关键概念,特别是在处理复杂对象时,确保对象的独立性与原始数据的完整性。本资料“ios-深拷贝对象.zip”可能包含了关于如何在Objective-C或Swift中实现深拷贝的实践示例,特别...
在Java编程中,将JSON对象转换为Java Bean对象是一个常见的任务,特别是在处理Web服务或API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而Java Bean是符合特定规范的Java类,通常用于...
- **定义**:深拷贝是指在进行对象复制时,不仅复制了对象本身,还会复制该对象内部指向的所有数据。 - **特点**: - 源对象和新对象完全独立,即使其中一个对象发生了改变也不会影响另一个对象。 - 对于包含引用...
模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码的重要手段。本主题将深入探讨如何使用注解实现不同对象、相同对象以及集合与集合之间的多次...
拷贝构造函数是类的一种特殊构造函数,用于将一个对象的内容复制到另一个对象中。在了解拷贝构造函数之前,首先需要了解普通对象和类对象的区别。普通对象是指基本数据类型的对象,如 int、double 等,而类对象是指...
在C++编程语言中,拷贝构造函数是类的一个特殊的构造函数,它用于创建一个新对象作为现有对象的副本。拷贝构造函数可以执行浅拷贝或深拷贝。浅拷贝是按位拷贝成员,这可能会导致共享数据导致的错误。深拷贝则创建了...
拷贝构造函数是一种特殊的构造函数,它用于初始化一个新对象作为现有对象的副本。 首先,让我们解释一下浅拷贝(Shallow Copy)。默认情况下,C++的拷贝构造函数执行浅拷贝,这意味着成员变量(包括指针)的值会被...
1. **对象作为值传递给函数参数**:当我们将类对象作为参数传递给函数时,编译器会创建一个临时对象,然后使用拷贝构造函数复制实参对象的值到这个临时对象中。 2. **对象通过另一个对象进行初始化**:当我们用一个...
在Python中,浅拷贝(shallow copy)和深拷贝(deep copy)是用于创建对象副本的两种常见方式。它们可以应用于不同类型的对象,如列表、字典、集合等。下面是对浅拷贝和深拷贝的描述: 浅拷贝:浅拷贝是创建一个新...
在前端开发中,对象拷贝是一项常用的操作,尤其是在处理数据更新、避免数据污染等场景时。jQuery 提供了一套简便的方法来实现对象拷贝,即 `$.extend()` 方法。本文将详细介绍 jQuery 中如何使用 `$.extend()` 进行...
总的来说,浅拷贝适用于数据结构简单且不包含复杂引用的对象,而深拷贝则用于需要确保新对象和原始对象完全独立的情况。在编写C#程序时,理解这两种拷贝方式的区别对于避免意外的数据修改至关重要。在实际项目中,...
二、Python对象拷贝 在Python中,对象的拷贝分为浅拷贝(shallow copy)和深拷贝(deep copy)。 1. 浅拷贝:通过`copy()`函数或`[:]`切片操作创建新对象,只拷贝对象的表面层次。如果原对象包含可变对象(如列表...
总结起来,浅拷贝、深拷贝和写时拷贝都是在处理对象拷贝时考虑的重点。理解它们的差异和适用场景是编写高效、安全的代码的关键。在实现涉及资源管理的类时,应确保正确处理拷贝构造函数、赋值运算符重载以及析构函数...
拷贝构造函数是C++编程语言中的一种特殊的构造函数,它用于初始化一个类的对象时拷贝另一个对象的内容。拷贝构造函数的存在是为了满足在C++中对象的复制需求,它可以在三个情况下被自动调用:第一种情况是当用类的一...