BeanUtils和PropertyUtils类是许多开源框架中频繁使用的两个工具,它们都能实现将一个类中的属性拷贝到另一个类中,这个功能甚至是spring实现依赖注入的基础。研究一下apache的comon包中如何实现这个两个工具,可以发现它们都是使用java.lang.reflect和java.beans这两个包下的几个类来实现的。
但是BeanUtils.copyProperties只支持两个对象之间的复制,其原理:是利用反射读取到第一个对象(源类)的所有属性,然后对这些属性集合进行for循环,再在for循环里面判断这些属性是否有set方法,有则再对第二个对象(目标类)进行循环取出属性一一对比,相等则调用目标类的set方法得到源类的get方法得到的值。
改后主要就是两点:第一:源类(Map类型)的Key作为属性和目标类的属性对比,相等则取出此Key的Value赋给目标类(当然还是用目标类此属性的set方法)。注意:如果是通过http请求的getParameterMap()得到的Map,其值是一个数组,一般只需要取第0项就可以了。
/** * 实现将源类(Map类型)属性拷贝到目标类中 * @param Map map 源Map对象 * @param Object obj 目标对象 */ public static void copyProperties(Map map, Object obj) throws Exception { // 获取目标类的属性信息 BeanInfo targetbean = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = targetbean.getPropertyDescriptors(); // 对每个目标类的属性查找set方法,并进行处理 for (int i = 0; i < propertyDescriptors.length; i++) { PropertyDescriptor pro = propertyDescriptors[i]; Method wm = pro.getWriteMethod(); if (wm != null) { Iterator ite = map.keySet().iterator(); while (ite.hasNext()) { String key = (String) ite.next(); // 判断匹配 if (key.toLowerCase().equals(pro.getName().toLowerCase())) { if (!Modifier.isPublic(wm.getDeclaringClass().getModifiers())) { wm.setAccessible(true); } Object value = ((String[]) map.get(key))[0]; String pt = splitSpace(pro.getPropertyType().getName()); // 判断类型是否匹配,不匹配则作强制转换 if (!(pt.equals(value.getClass().getName()))) { value = parseByType(pro.getPropertyType(), value.toString()); } // 调用目标类对应属性的set方法对该属性进行填充 wm.invoke((Object) obj, new Object[] { value }); break; } } } } }
相关推荐
Java Beanutils.copyProperties() 用法详解 Java Beanutils.copyProperties() 方法是 Java 中一个非常有用的工具,主要用于将一个 JavaBean 的属性复制到另一个 JavaBean 中。今天,我们将详细介绍 Java Beanutils....
一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...
此外,Java标准库中提供了`org.springframework.beans.BeanUtils`或者Apache Commons Lang的`BeanUtils.copyProperties()`方法,它们提供了更完善的转换功能,包括处理嵌套属性、类型转换等。这些工具类的使用可以...
MapStruct 是一个强大的Java实体映射工具,它旨在简化对象之间的转换过程,特别是在处理大量属性映射时。传统的手动设置属性或使用BeanUtils.copyProperties()方法可能会效率低下,且易出错。MapStruct通过注解...
5. **枚举操作**:`EnumUtils`类提供了对Java枚举类型的友好支持,如枚举值的转换和检查。 6. **类型转换**:`TypeConversionUtils`和`ConvertUtils`类提供了类型之间的安全转换,避免了因类型不匹配引发的异常。 ...
- **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现对象间的属性复制,但不支持自定义复制规则。 - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,...
在处理复杂的查询条件时,如果后端期望接收的是实体类型而不是Map类型,可以使用实体类来封装查询条件。 **示例**: ```java UserQuery query = new UserQuery(); query.setName("张三"); query.setAge(25); List...
`JavaBeanUtil`可能与`BeanUtils`相似,但可能存在一些特定的实现或扩展功能,比如支持自定义转换规则、处理复杂类型的属性等。在实际使用中,我们应根据具体需求来选择合适的工具类。 在源码层面,`MapUtils`和`...
在Java开发中,Apache Commons BeanUtils库是一个非常实用的工具包,它提供了许多方便的方法来操作JavaBeans。本文将深入探讨`BeanUtilsBean`对象复制的功能,特别关注它如何实现类型自动转换。`BeanUtilsBean`是...
apache的BeanUtils的copyProperty以及copyProperties方法不支持String与java.util.Date的类型相互转换 该包对源码进行了部分修改,使其支持对String与Date之间的类型转换。 2008-07-17更新: 增加了...
该包对源码进行了部分修改,使其支持对String与Date之间的类型转换. 注:该包在对null的Date转换时会抛出No value specified的异常。如需支持对null的Date转换,请下载我的“commons-beanutils-jesse.zip(20080717更新...
MapStruct 是一种类型安全的 bean 映射类生成 Java 注释处理器,它简化了对象间属性的映射过程。开发者只需定义一个映射接口并声明所需的映射方法,在编译过程中 MapStruct 将自动为该接口生成实现类。这种机制避免...
在Java编程中,数据结构是程序设计的基础,而List接口作为集合框架的重要组成部分,常常用于存储有序的元素序列。当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用...
该包对源码进行了部分修改,使其支持对String与Date之间的类型转换。 2008-07-17更新: 增加了BeanUtils的copyProperty以及copyProperties方法对Date的null值复制功能,取消了当Date为null时的抛异常。 2008-08-25...
- 对于可能出现的异常情况,如数据类型不匹配、除数为零等,应提前进行检查并处理,确保程序的健壮性和稳定性。 7. **测试验证**: - 设计测试用例,覆盖各种可能的输入情况,包括但不限于正向案例、边界条件和...
- 如果属性为复杂类型,如数组或集合,需要确保Map的值类型匹配。 - 调用BeanUtils方法时,若JavaBean属性不存在或setter/getter方法不匹配,可能会抛出异常,需做好异常处理。 5. **应用场景** BeanUtils工具...
根据给定的信息,我们可以整理出以下与Java开发相关的知识点: ### 1. 日期与时间处理 #### 1.1 转换字符串为日期 ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf...
2. **类型转换**:BeanUtils库内置了类型转换机制,可以将字符串等类型的值转换为Java对象期望的类型,比如将字符串转换为整数、日期等。 3. **批量属性复制**:`copyProperties()`方法可以快速地将一个对象的所有...
在Java中,可以通过实现`Cloneable`接口并重写`clone()`方法来实现浅拷贝。例如: ```java public class Food implements Cloneable { ... @Override protected Object clone() throws ...