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( )用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...
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更新...
该包对源码进行了部分修改,使其支持对String与Date之间的类型转换。 2008-07-17更新: 增加了BeanUtils的copyProperty以及copyProperties方法对Date的null值复制功能,取消了当Date为null时的抛异常。 2008-08-25...
主要介绍了使用BeanUtils.copyProperties进行对象之间的属性赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
继承org.springframework.beans.BeanUtils 修改copyProperties方法赋值时,为null时不进行处理,方便开发工具类
java8 源码 wx_order 日志 logback替代了log4j logback实现了Slf4j Api xml配置日志 filter过滤error 可以配置时间滚动策略 类注释和方法注释 /** * @Auther: ${USER} * @Date: ${DATE} ${HOUR}:${MINUTE} * @...
业务代码解耦方案与案例源码,类似于BeanUtils.copyProperties工具,不仅能进行相同字段名相同类型的字段值复制,还能进行不同类型或字段的转换
如果 List<T> 里的 T 是引用类型(如myClass类),则在 像这种写法: List<myClass> lists1 = new List() { new myClass(), new myClass() }; List<myClass> lists2 = new List(lists1 ); 其实是一个浅复制的...
shoppingmall2 ... 除此之外,还可以使用BeanUtils.copyProperties,例如Account account = modelMapper.map(AccountDto.Create dto,Account.class); 像这样。 用@Valid等检查域上的对象,并将结果值作为Bi
struts 技巧运用 1:利用Token解决重复提交 2:copyProperties 3:文件上传 4:等
apache 的 beanutil 包含了一些在实体属性转换的方法,如 copyProperties(P1,P2);
public class SysUserGroup implements java.io.Serializable { private Integer id; private String remark; // 备注 private String name; // 部门名称 private String principal; // 部门负责...