`
herryhaixiao
  • 浏览: 90272 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对象值的拷贝

    博客分类:
  • java
阅读更多

应用场景:

在做修改操作时,需要根据ID加载整个对象,然后一个一个赋值到对象中,然后进行save操作。

在字段比较少的情况下,还是比较快的,如果字段比较多,就比较繁琐,需要一个一个set对应的字段。

举个例子:

比如一个表有20个字段,如果这20个字段都修改过,则在Service需要对这20个字段进行更新操作,一种做法是load出整个对象,然后一个一个值设置到对应的字段中。这样做当然没错,但是多了些比较无聊的事情,需要20行代码进行赋值。然后进行更新。20个还好,如果一个表中有50个字段。那就得50行。故为了这个事情,写了个值拷贝的方法。把新值放到对象中,然后把新值对象拷贝至旧值对象进行值对象的拷贝。现把这个共享出来。

 

 

 

/** 
 * ObjectUtils.java
 * create on 2011-01-01 
*/

import java.lang.reflect.Field;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.lang.StringUtils;
		
/**
 * Bean相关操作处理工具类
 * @since version1.0
 * @author liuhaixiao
 */
@SuppressWarnings("rawtypes")
public class ObjectUtils {

	/**
	 * 根据传入的cls复制整个对象的属性值到另外一个对象的对应的同名和同类型的属性(只复制cls存在的且属同名和同类型的属性值,名为sguid的属性不拷贝)
	 * @param vo<Object> 源值对象
	 * @param target<Object> 目标对象
	 * @param cls<Class> 被拷贝值的对象类型
	 * @param not_copy<String> 用于指定不拷贝值的属性,可传多个属性名,之间用逗号隔开
	 * @return void
	 */
	private static void copyObjectValue(Object vo, Object target, Class cls, String not_copy, boolean isCopyNull){
		int flag=0;
		if(StringUtils.isNotBlank(not_copy)){
			not_copy=","+not_copy+",";//前后加逗号是为了后面能够准确的判断所包含的属性名称
		}
		
		try{
			String sname = "";
			Field[] fields = cls.getDeclaredFields();
			
			for (int i = 0; i < fields.length; i++) {	
				sname = fields[i].getName();

				//如果属性为id或属性名存在于not_copy指的属性名范围中,则不拷贝访属性值
				if(sname.toLowerCase().equals("id") || (StringUtils.isNotBlank(not_copy) && not_copy.indexOf(","+sname+",")!=-1))
					continue;
				
				if(fields[i].getType().toString().startsWith("class") 
						&& !fields[i].getType().getName().equals("java.lang.String")){ //对象类型字段值拷贝
					try{
						BeanUtils.setProperty(target, sname, 
								MethodUtils.invokeMethod(vo,"get"+sname.substring(0, 1).toUpperCase()+sname.substring(1),null));
					}catch(Exception ne){
						flag=1;
						continue;
					}			
				}else{ //基本类型字段值拷贝
					try{
						if(isCopyNull==false && BeanUtils.getProperty(vo, sname)==null){
							continue;
						}else{
							BeanUtils.setProperty(target, sname, BeanUtils.getProperty(vo, sname));
						}
					}catch(Exception ne){
						flag=1;
						continue;
					}	
				}
			}			
		}catch(Exception e){
			flag=1;
			e.printStackTrace();
		}
		
		if(flag==1){
			flag=0;
			System.gc();
		}
	}
	
	/**
	 * 复制整个对象的属性值到另外一个对象的对应的同名和同类型的属性
	 * @param vo<Object> 源值对象
	 * @param target<Object> 目标对象
	 * @return void
	 */
	public static void copyObjValue(Object vo, Object target){
		Class cls=vo.getClass();
		while(!cls.getName().equals("java.lang.Object")){
			copyObjectValue(vo, target, cls, null, false);
			cls=cls.getSuperclass();
		}
	}
	
	/**
	 * 复制整个对象的属性值到另外一个对象的对应的同名和同类型的属性
	 * @param vo<Object> 源值对象
	 * @param target<Object> 目标对象
	 * @param isCopyNull<boolean> 是否拷贝NULL值
	 * @return void
	 */
	public static void copyObjValue(Object vo, Object target, boolean isCopyNull){
		Class cls=vo.getClass();
		while(!cls.getName().equals("java.lang.Object")){
			copyObjectValue(vo, target, cls, null, isCopyNull);
			cls=cls.getSuperclass();
		}
	}
	
	/**
	 * 复制整个对象的属性值到另外一个对象的对应的同名和同类型的属性,但名为sguid的属性不拷贝
	 * @param vo<Object> 源值对象
	 * @param target<Object> 目标对象
	 * @param not_copy<String> 用于指定不拷贝值的属性,可传多个属性名,之间用逗号隔开
	 * @return void
	 */
	public static void copyObjValue(Object vo, Object target, String not_copy){
		Class cls=vo.getClass();
		while(!cls.getName().equals("java.lang.Object")){
			copyObjectValue(vo, target, cls, not_copy, false);
			cls=cls.getSuperclass();
		}
	}
	
	/**
	 * 复制整个对象的属性值到另外一个对象的对应的同名和同类型的属性,但名为sguid的属性不拷贝
	 * @param vo<Object> 源值对象
	 * @param target<Object> 目标对象
	 * @param not_copy<String> 用于指定不拷贝值的属性,可传多个属性名,之间用逗号隔开
	 * @param isCopyNull<boolean> 是否拷贝NULL值
	 * @return void
	 */
	public static void copyObjValue(Object vo, Object target, String not_copy, boolean isCopyNull){
		Class cls=vo.getClass();
		while(!cls.getName().equals("java.lang.Object")){
			copyObjectValue(vo, target, cls, not_copy, isCopyNull);
			cls=cls.getSuperclass();
		}
	}
}

  

具体使用方法如下:

 

 

 

把新的对象中的值复制到旧的对象中。

public void update(B new, String id) { 
     A old = Dao.get(id);
     ObjectUtils.copyObjValue(new, old);
}

 很好用,谁用谁知道。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    两个对象属性值的拷贝和文件的拷贝

    实现了两个对象之间属性值的拷贝,只要具有相同的属性名就可以拷贝,还有两个file对象的拷贝,实现文件的复制功能

    拷贝JSON对象值进Java Bean对象

    JSON对象由键值对组成,键是字符串,值可以是各种数据类型,包括字符串、数字、数组、对象等。在Java中,我们通常使用`org.json`库或`com.google.gson`库来解析和创建JSON对象。 以`org.json`库为例,我们可以使用`...

    java值拷贝

    在Java编程中,值拷贝(Value Copy)是一种常见的数据操作,主要用于对象之间的属性值复制。这个主题涉及到Java中的浅拷贝和深拷贝概念,以及如何利用工具库如Apache Commons BeanUtils进行对象属性的便捷复制。 ...

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

    3. **构造表达式树**:为每个属性构造一个赋值表达式,这涉及到创建一个新对象,然后逐个设置属性值。表达式树将表示这种赋值逻辑。 4. **编译表达式**:使用`Expression.Lambda`和`Compile`方法将表达式树编译成...

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

    在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如 A=B。这时,如果 B 中有一个成员变量指针已经申请了内存,那 A 中的那个成员变量也指向同一块内存。这...

    C#中的浅拷贝和深拷贝

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

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List&lt;T&gt; oldList = new List(); oldList.Add(..); List&lt;T&gt; newList = new List(oldList); 二、List对象中的T是引用...

    dotnet-ShengMapper对象属性值映射拷贝工具

    对象属性值映射/拷贝工具。不需要创建映射规则,不要求对象类型一致,适用于简单直接的拷贝操作,可以全属性拷贝,指定属性拷贝,排除指定的属性。拷贝包含 10 个属性的对象 10 万次,耗时 4.x 秒(普通开发机)。

    利用反射技术实现POJO值拷贝

    在Java中,如果要手动实现两个POJO对象之间的值拷贝,可能会涉及大量的重复代码。但是,通过反射技术,我们可以编写一个通用的方法来自动完成这个过程,提高代码的复用性和效率。 首先,我们需要导入`java.lang....

    14 - JavaScript 引用和值拷贝.rar

    在 JavaScript 中,我们经常会遇到“引用”和“值拷贝”的概念,这是理解变量工作原理的关键。本篇文章将深入探讨这两个概念以及它们在实际编程中的应用。 1. 值类型与引用类型 在 JavaScript 中,数据类型分为两大...

    C++中的位拷贝和值拷贝.pdf

    **值拷贝(Value Copy)**则是指在创建对象或执行赋值操作时,复制对象的实际内容而不是地址。这意味着源对象和目标对象各自拥有独立的内存空间,因此对其中一个对象的修改不会影响另一个对象。 #### 二、位拷贝...

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

    - **构造函数**:通过对象的构造函数创建新对象,并将源对象的属性值逐一赋值给新对象,实现浅拷贝。 - **序列化与反序列化**:将对象序列化为字节数组,然后再反序列化为新的对象,实现深拷贝。 3. **注解实现...

    对象属性值的复制工具类

    对象属性值的复制工具类 1.全复制 2.部分复制 3.部分不复制

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

    在C++编程中,类对象的深拷贝和浅拷贝是两个重要的概念,它们涉及到对象复制时内存管理的问题。当我们创建一个类的实例并将其赋值给另一个实例时,拷贝构造函数会被调用。拷贝构造函数是一种特殊的构造函数,它用于...

    javaEE的对象拷贝工具dozer

    Java EE对象拷贝工具Dozer是一款强大的数据映射库,它简化了在Java对象之间进行深度复制的过程。在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅...

    多维数组和对象-深去重和深拷贝.js

    对多维数组,对象,进行去重,相同的值只保留一个,常见的new Set()和filter,只能去重一维数组,并不能进行深层的去重,逻辑:判断是否为对象,为对象判断是否为数组或是真的对象,递归一直筛选为值,判断首次...

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

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

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

    在Python编程语言中,对象的比较、拷贝和参数传递是三个非常基础且重要的概念,它们构成了Python程序设计的基础。让我们深入探讨这三个话题。 一、Python对象比较 Python中的对象比较主要涉及到对象的相等性...

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

    深拷贝则创建了一个全新的对象,其所有属性和子属性都是原始对象的副本,即使属性值是对象,也会递归复制。深拷贝确保了修改原始对象不会影响副本。在JavaScript中,实现深拷贝的方法包括递归复制、使用`JSON.parse...

    C++中的位拷贝与值拷贝

    在C++编程中,对象复制是一个常见的操作,分为两种主要方式:位拷贝(bitwise copy)和值拷贝(value copy)。位拷贝通常被称为浅拷贝,而值拷贝被称为深拷贝。这两种拷贝方式在处理含有动态分配资源的类对象时有着...

Global site tag (gtag.js) - Google Analytics