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

Java copyProperties

    博客分类:
  • Java
阅读更多

自己写了个copyProperties方法,虽没apache与spring的强大,但功能自己够用就好,而且不用引入第三方库。

 

package bean;

import java.lang.reflect.Method;

/**
 * @version 1.0
 * @author fireinjava
 * @data Dec 11, 2009
 * @描述: 存放字段及其要用到的对应get(来自sourceBean)与set(来自targetBean)方法
 */
public class PropertyMethod {

	private String propertyName;
	private Method methodRead;
	private Method methodWrite;
	
	public String getPropertyName() {
		return propertyName;
	}
	public void setPropertyName(String propertyName) {
		this.propertyName = propertyName;
	}
	public Method getMethodRead() {
		return methodRead;
	}
	public void setMethodRead(Method methodRead) {
		this.methodRead = methodRead;
	}
	public Method getMethodWrite() {
		return methodWrite;
	}
	public void setMethodWrite(Method methodWrite) {
		this.methodWrite = methodWrite;
	}
	
}

 

package bean;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0
 * @author fireinjava
 * @data Dec 11, 2009
 * @描述:拷贝Bean(适用于标准JavaBean,且拷贝的属性类型必须一致)
 */
public class BeanUtils {
	
	public static void copyProperties(Object source, Object target) throws IllegalArgumentException,
			IllegalAccessException, InvocationTargetException {
		copyProperties(source, target, null);
	}

	/**
	 * 当某个属性不必复制或两个Bean属性名称一样且类型不一样时用(得另外设值)
	 */
	public static void copyProperties(Object source, Object target, String[] ignoreProperties)
			throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		if (source == null)
			throw new IllegalArgumentException("Source must not be null");
		else if (target == null)
			throw new IllegalArgumentException("Target must not be null");

		List<String> ignoreList = null;
		if (ignoreProperties != null)
			ignoreList = Arrays.asList(ignoreProperties);

		List<PropertyMethod> listPm = new ArrayList<PropertyMethod>();
		Map<String, Method> mapMethodWrite = new HashMap<String, Method>();
		Map<String, Method> mapMethodRead = new HashMap<String, Method>();

		Method[] methodTarget = target.getClass().getMethods();
		for (Method mt : methodTarget)
			if (mt.getName().startsWith("set")) {
				String propertyName = mt.getName().substring(3, 4).toLowerCase() + mt.getName().substring(4);
				if (ignoreList == null || !ignoreList.contains(propertyName))
					mapMethodWrite.put(propertyName, mt);
			}

		Method[] methodSource = source.getClass().getMethods();
		for (Method ms : methodSource)
			if (ms.getName().startsWith("get"))
				mapMethodRead.put(ms.getName().substring(3, 4).toLowerCase() + ms.getName().substring(4), ms);
			else if (ms.getName().startsWith("is"))
				mapMethodRead.put(ms.getName().substring(2, 3).toLowerCase() + ms.getName().substring(3), ms);

		Iterator<String> iter = mapMethodWrite.keySet().iterator();
		while (iter.hasNext()) {
			String propertyName = iter.next();
			if (mapMethodRead.get(propertyName) != null) {
				PropertyMethod pm = new PropertyMethod();
				pm.setPropertyName(propertyName);
				pm.setMethodRead(mapMethodRead.get(propertyName));
				pm.setMethodWrite(mapMethodWrite.get(propertyName));
				listPm.add(pm);
			}
		}

		for (PropertyMethod pm : listPm) {
			Object[] obj = new Object[1];
			obj[0] = pm.getMethodRead().invoke(source, new Object[0]);
			pm.getMethodWrite().invoke(target, obj);
		}

	}
}

其中List<PropertyMethod> listPm = new ArrayList<PropertyMethod>();用来存放完整的属性及属性Get/set方法,不借助 PropertyMethod而直接用两个Map也可。

 

另外两种copyProperties:

    org.apache.commons.beanutils.BeanUtils.copyProperties(target, source);

                            //source中的Timestamp类型属性值不可为null 否则会报错

    org.springframework.beans.BeanUtils.copyProperties(source, target);

 

2
0
分享到:
评论

相关推荐

    BeanMapper:比BeanUtils.copyProperties更快

    一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...

    java Beanutils.copyProperties( )用法详解

    Java Beanutils.copyProperties() 用法详解 Java Beanutils.copyProperties() 方法是 Java 中一个非常有用的工具,主要用于将一个 JavaBean 的属性复制到另一个 JavaBean 中。今天,我们将详细介绍 Java Beanutils....

    java List 深度复制方法

    在Java编程中,数据结构是程序设计的基础,而List接口作为集合框架的重要组成部分,常常用于存储有序的元素序列。当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用...

    java Map转换成bean,利用java反射以及java和bean包

    此外,Java标准库中提供了`org.springframework.beans.BeanUtils`或者Apache Commons Lang的`BeanUtils.copyProperties()`方法,它们提供了更完善的转换功能,包括处理嵌套属性、类型转换等。这些工具类的使用可以...

    java工具类 utils.zip

    如`copyProperties(Object source, Object target)`可以将源对象的属性复制到目标对象。 9. **FileUtil.java**:文件操作工具类,提供读写文件、创建目录、删除文件等方法。例如,`readFileToString(File file, ...

    java开发记录方法

    PropertyUtils.copyProperties(dest, orig); ``` `PropertyUtils`是Apache Commons BeanUtils中的工具类,用于复制对象属性。 #### 4.2 字段比较 ```java EqualsBuilder.reflectionEquals(lhs, rhs, excludeFields)...

    超额发票单据按照限额拆分java

    #### 二、Java实现超额发票单据拆分的技术要点 1. **参数定义与初始化**:首先明确拆分方法所需参数,并对其进行初始化。 - `Map, Object&gt; params`:用于传递拆分所需的各类参数,如发票单据对象、明细项列表等。 ...

    Java工具类之Apache的Commons Lang和BeanUtils

    1. **属性拷贝**:`BeanUtils.copyProperties()`方法可以方便地将一个对象的属性值复制到另一个对象,大大简化了对象间的属性映射。 2. **属性访问**:`PropertyUtils`类提供了对Java对象属性的无反射访问,可以...

    Java常用工具类包包含各种常用开发工具

    - Apache Commons BeanUtils库也提供了丰富的Bean操作,如`copyProperties()`方法可以方便地复制一个Bean的属性到另一个Bean。 5. **其他工具类**: - `java.util.Arrays`提供了对数组的各种操作,如排序、查找、...

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

    - **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现对象间的属性复制,但不支持自定义复制规则。 - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,...

    如何使用BeanUtils.copyProperties进行对象之间的属性赋值

    总的来说,`BeanUtils.copyProperties`是Java开发中一个非常实用的工具,它简化了对象间属性赋值的过程,提高了代码的简洁性和可维护性。在实际应用中,开发者应根据具体需求选择合适的使用方式,并注意处理可能出现...

    java中的指针,引用及对象的clone

    这通常需要手动实现或使用工具类如`Apache Commons Lang`的`BeanUtils.copyProperties()`方法来实现。 #### 五、结论 Java虽然没有传统的指针概念,但它通过引用机制实现了类似的功能。了解Java中对象的传递方式和...

    阿里巴巴Java开发手册(嵩山版).pdf

    - 使用Spring Framework中的`BeanUtils.copyProperties()`方法,它不仅支持多种类型转换,而且在性能方面也优于Apache Beanutils。 - 考虑使用Cglib提供的`BeanCopier`工具,该工具通过生成特定的类来实现快速属性...

    Java笔记word.docx

    ### Java知识点总结 #### 1. 查询数据返回值为空及解决方法 在使用Java进行数据库操作时,可能会遇到查询结果为空的情况。这可能是由于查询条件不符合任何记录导致的。为了解决这一问题,通常需要检查SQL语句是否...

    java值拷贝

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

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    4. **使用工具类或库**:例如,Apache Commons Lang库提供了`BeanUtils.copyProperties()`方法,可以方便地将一个对象的所有属性复制到另一个对象。这种方法简单易用,但需要注意的是,如果源对象和目标对象有属性...

    commons-beanutils-1.7.0_java_java编程_

    3. **批量属性复制**:`copyProperties()`方法可以快速地将一个对象的所有属性复制到另一个对象中,这在对象模型相同或相似的情况下非常有用,极大地提高了开发效率。 4. **内建集合操作**:BeanUtils还支持对集合...

    Java反射操作(需要commons-beanutils-1.8.2.jar)

    Apache Commons BeanUtils库简化了这些操作,它提供了如`BeanUtils.copyProperties()`这样的方法,可以方便地将一个对象的属性值复制到另一个对象。此外,`PropertyUtils`类提供了更细粒度的属性操作,如`...

    JAVA工具类

    Apache Commons BeanUtils库提供了`BeanUtils.copyProperties()`方法实现Bean到Bean的转换,而Map到Bean的转换可以借助`Dozer`或`ModelMapper`库。这些工具可以帮助我们在数据绑定和对象映射中节省大量工作。 4. **...

Global site tag (gtag.js) - Google Analytics