JAVA重写copyProperties,使其支持Map类型
2013-09-05 16:38
155 查看
最近,项目组要用到一个功能,就是用BeanUtils.copyProperties复制一个Map里的属性值到另外一个对象。
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项就可以了。
BeanUtils.copyProperties方法的源码限于篇幅,就不贴在此处了,有兴趣的可以百度一下或到我博客上去查看。
扩展后的copyProperties方法,这里为了表示和BeanUtils有“亲缘关系”,就新建了同名类并用同名方法,只是多做了一些处理,使其支持int/Integer、Date和自定义对象。限于篇幅只贴了核心代码,详细的可以访问我的博客:
http://blog.csdn.net/leadergg/archive/2008/12/11/3495586.aspx
/**
实现将源类(Map类型)属性拷贝到目标类中
* @param
Map map 源Map对象
* @param
Object obj 目标对象
* @auther
<a href="mailto:gaoxuguo@feinno.com">Gao
XuGuo</a>
*
2009-11-30 13:11:29
*/
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;
}
}
}
}
}
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项就可以了。
BeanUtils.copyProperties方法的源码限于篇幅,就不贴在此处了,有兴趣的可以百度一下或到我博客上去查看。
扩展后的copyProperties方法,这里为了表示和BeanUtils有“亲缘关系”,就新建了同名类并用同名方法,只是多做了一些处理,使其支持int/Integer、Date和自定义对象。限于篇幅只贴了核心代码,详细的可以访问我的博客:
http://blog.csdn.net/leadergg/archive/2008/12/11/3495586.aspx
/**
实现将源类(Map类型)属性拷贝到目标类中
* @param
Map map 源Map对象
* @param
Object obj 目标对象
* @auther
<a href="mailto:gaoxuguo@feinno.com">Gao
XuGuo</a>
*
2009-11-30 13:11:29
*/
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反射机制将Map转换为Java对象,支持Boolean、Date类型
- 如何让xdoclet 的spring 标签支持java.util.Map类型属性的注入
- 在java的switch支持的类型
- Java从数据库取出BLOB数据放入map中,从map中拿出转换成String类型数据
- Java 遍历利用entry遍历Map时类型转换的问题
- Java学习解疑1——Java支持的变量类型
- Java为什么不支持泛型类型的数组
- Java类型推断将不再支持可变性规范
- Java XML解析,,Node直接转为对象。考虑了一般的类,简单类型,数组,还未考虑List,Map
- Java的switch是否支持String作为参数,还支持哪些类型?
- Java 在 Map 中使用复杂数据类型作为 Key
- java sqlxml (有错误,sqlite3可能不支持xml类型)
- Java实现对象转换成Map以及类型处理
- Java复习笔记(1)——Java支持数据类型和相关操作
- 分析一下为什么JAVA不支持泛型类型的数组
- java技术支持 练习使用八种基本数据类型
- java List Collections.sort 排序 支持 对象属性 普通数据类型
- java keytool支持的类型及如何将证书导入jks中
- 重载copyProperties,使其支持Map类型
- iBATIS SQL Maps之支持ParameterMap和ResultMap的数据类型的对照表。