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

值对象之间的拷贝工具类

    博客分类:
  • java
阅读更多

利用java反射机制处理同对象或者有部分相同属性的类之间的值复制。在java开发过程中这种对象值的拷贝是非常常见的,故公开提供此方法。

 

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
 */
@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();
		}
	}
}

 

0
0
分享到:
评论

相关推荐

    javaEE的对象拷贝工具dozer

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

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

    - **使用工具类**:如Apache Commons Collections的`CollectionUtils.copy()`方法,可以实现集合的深拷贝。 5. **注解实现集合复制** - 在集合元素类上使用注解,配合使用上述的Dozer或ModelMapper库,可以实现...

    28个java常用的工具类源码

    10. **对象拷贝工具类**:如BeanUtils,实现对象属性的深度或浅度复制,减少了手动编写复制代码的工作。 11. **编码解码工具类**:如EncodingUtils,支持各种字符编码和解码,解决跨平台时的编码问题。 12. **正则...

    bean,json工具类

    3. **Map与Bean互转**:此外,工具类还可能支持Map对象与Bean对象之间的转换。Map对象的键对应于Bean的属性名,值则对应属性值。这种转换可以帮助在不关心具体Bean结构的情况下,灵活地处理数据。 4. **数据拷贝**...

    java不同对象之间及集合的复制

    在Java编程中,对象之间的复制是一项常见的操作,特别是在数据传输、模型转换或者持久化存储等场景下。这里的“java不同对象之间及集合的复制”主要关注如何高效且便捷地完成对象及其集合的复制工作,避免繁琐的手动...

    Java工具类之Apache的Commons Lang和BeanUtils

    Java工具类是开发过程中不可或缺的一部分,它们提供了许多实用的功能,帮助开发者提高代码的效率和可维护性。Apache Commons Lang和BeanUtils是两个非常著名的Java工具库,由Apache软件基金会开发和维护。这两个库...

    6第六章 工具类与算法.ppt

    在Java编程语言中,工具类和算法是两个重要的概念,它们在软件开发中扮演着不可或缺的角色。本章主要探讨了Java中的工具类及其常见的使用,同时也涵盖了基础算法的应用。 首先,我们关注Java中的`Object`类,它是...

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

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

    winform 深拷贝的实现源码

    这时就需要通过深拷贝来确保新对象与原对象之间的独立性。 深拷贝的实现通常有以下几种策略: - **手动实现**:对于每一个可能包含引用类型的属性,都需要编写代码进行递归复制。 - **接口实现**:定义一个...

    28个java常用的工具类

    14. **对象拷贝工具类**:如`BeanUtils`,提供了对象属性的复制功能,`copyProperties()`可以将源对象的属性复制到目标对象。 15. **安全加密工具类**:如`SecurityUtils`,包含了加密和解密方法,如`md5Encode()`...

    C++规定与类同名的函数就是拷贝构造函数

    拷贝构造函数是C++类的一个重要特性,它涉及到类对象之间的复制。当我们谈论“C++规定与类同名的函数就是拷贝构造函数”时,实际上是指一个类中定义的与类名相同且参数为该类类型的函数,这就是拷贝构造函数。 拷贝...

    类属性拷贝器(源码)

    综上所述,类属性拷贝器是C#开发中一个实用的工具,它通过反射和属性映射简化了对象之间的状态转移,提高了代码的可读性和效率。`BeanUtils.cs`文件很可能是实现这一功能的关键代码,值得深入研究和理解。

    BeanUtils工具类的使用.zip

    在Java开发中,Apache Commons BeanUtils是一个非常实用的工具库,它简化了对象属性的设置、获取以及对象之间的属性拷贝等操作。本资源包主要围绕`BeanUtils`工具类的使用进行讲解,旨在帮助开发者更好地理解和应用...

    浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    深度拷贝是指创建一个新对象,不仅复制原始对象的属性,还复制了嵌套对象的引用,确保新旧对象之间的独立性。本文将探讨C#中List对象的深度拷贝问题。 首先,我们来看当List中的T是值类型,如int、double等时的情况...

    Java 细数浅拷贝和深拷贝

    深拷贝(Deep Copy)则是指完全复制对象本身及其包含的所有引用类型的数据,使得拷贝后的对象与原始对象之间相互独立,任何一方的变化都不会影响到另一方。这种方式确保了对象的完整独立性。 实现深拷贝的一种常见...

    BeanUtils工具类

    BeanUtils的核心功能是属性的复制,它通过反射机制来实现对象之间属性值的拷贝。例如,当我们从数据库查询结果中得到一个结果集,通常会将这些结果映射到Java Bean对象上,BeanUtils可以帮助我们自动填充Bean对象的...

    BeanUtils工具 .jar 包

    BeanUtils工具.jar包是Apache Commons项目中的一个核心组件,它为Java开发人员提供了一套方便的工具类,用于处理Java Bean对象之间的属性复制、类型转换等常见操作。这个库简化了对象模型之间的数据绑定,特别是在...

    dotnet-AutoCopy一个可以缩短开发时间的工具类

    总的来说,AutoCopy是.NET开发中的一个强大辅助工具,它通过自动化处理对象之间的复制工作,让开发者可以更加专注于核心业务逻辑的实现,提高开发质量和效率。对于大型项目或者团队协作来说,这样的工具类库可以带来...

    JavaScript 函数库、工具类

    JavaScript函数库和工具类是开发Web应用不可或缺的部分,它们提供了大量的预定义函数和实用方法,大大简化了开发者的工作。在JavaScript的世界里,有许多知名的库和工具,如jQuery、Lodash、Underscore等,但这次...

    关于类和对象的进一步讨论讲稿.pptx

    在面向对象编程中,类和对象是核心概念。类是一种抽象的数据类型,它定义了一组属性(数据成员)和操作(成员函数),用于封装数据和行为。对象则是类的实例,具备类所定义的属性和行为。本讲稿将深入探讨类和对象的...

Global site tag (gtag.js) - Google Analytics