java中Map转化为bean
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中Map转化为bean相关的知识,希望对你有一定的参考价值。
Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值,在java编程中会经常用到。但是当我们进行业务逻辑的处理或着操作数据库时,往往应用的是我们自己定义的的Bean或VO来传递和存储数据,这就需要我们应用一个公共方法来将map中存储的数据转换为相对应的Bean或VO,主要用到java中反射技术。
以下为本人在项目中用到的工具类,它囊括了我们常用的数据类型,代码如下:
package test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
//Map转化为bean
public class MapToVoUtil {
public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public static <T> Object refelctBean(Map map , T t){
Object obj = null;
Class clazz = t.getClass();
try {
obj = clazz.newInstance();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if(method.getName().startsWith("set")){
String key = method.getName().replace("set", "");
key = key.substring(0, 1).toLowerCase().concat(key.substring(1));
Object value = map.get(key);
if(value==null || value.equals("N/A")) continue;
Class<?>[] paramType = method.getParameterTypes();
//根据参数类型执行对应的set方法给vo赋值
if(paramType[0] == String.class){
method.invoke(obj, String.valueOf(value));
continue;
}else if(paramType[0] == BigDecimal.class){
method.invoke(obj, new BigDecimal(value.toString()));
continue;
}else if(paramType[0] == Double.class){
method.invoke(obj, Double.parseDouble(value.toString()));
continue;
}else if(paramType[0] == Date.class){
method.invoke(obj, StringToDate(value.toString()));
continue;
}else if(paramType[0] == int.class || paramType[0] == Integer.class){
method.invoke(obj, Integer.valueOf(value.toString()));
continue;
}else if(paramType[0] == Boolean.class){
method.invoke(obj, Boolean.parseBoolean(value.toString()));
continue;
}else if(paramType[0] == char.class || paramType[0] == Character.class){
method.invoke(obj, value.toString().charAt(0));
continue;
}
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return obj;
}
//字符串转日期
public static Date StringToDate(String str){
Date date = null;
try {
date = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
//日期转字符串
public static String DateToString(Date date){
String str = null;
str = sdf.format(date);
return str;
}
}
在实际项目中我们可能还会遇到一些vo会继承一些baseVo,此时若想将通过map给baseVo中的属性赋值,那么我们就要在工具类中加入如下代码:
Class superClazz = t.getClass().getSuperclass();
Method[] superMethods = clazz.getDeclaredMethods();
然后遍历,执行baseVo中的set方法,为父类属性赋值。此时可以在参数中加一个标记flag,调用者根据传入的Vo是否有继承的自定义的baseVo来决定是否执行上面的代码。
以上是关于java中Map转化为bean的主要内容,如果未能解决你的问题,请参考以下文章