欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HashMap转JavaBean

程序员文章站 2022-06-15 10:18:04
一、HashMap转JavaBean1、方式一//把Map转化为JavaBeanpublic static T map2bean(Map map,Class clz) throws Exception{T obj = clz.newInstance();//从Map中获取和属性名称一样的值,把值设置给对象(setter方法)BeanInfo b = Introspector.getBeanInfo(cl....

一、HashMap转JavaBean

1、方式一

//把Map转化为JavaBean
public static <T> T map2bean(Map<String,Object> map,Class<T> clz) throws Exception{
	T obj = clz.newInstance();
	//从Map中获取和属性名称一样的值,把值设置给对象(setter方法)
	BeanInfo b = Introspector.getBeanInfo(clz,Object.class);
	PropertyDescriptor[] pds = b.getPropertyDescriptors();
	for (PropertyDescriptor pd : pds) {
		//得到属性的setter方法
		Method setter = pd.getWriteMethod();
		//得到key名字和属性名字相同的value设置给属性
		setter.invoke(obj, map.get(pd.getName()));
	}
	return obj;
}


public static <T> T populate(Map<String, Object> map, Class<T> clz) throws Exception {
	T obj = clz.newInstance();
	//拿到  BeanInfo
	BeanInfo beanInfo = Introspector.getBeanInfo(clz);
	//通过 beaninfo 获取所有的描述器
	PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
	for (PropertyDescriptor pd : pds) {
		//获取属性的名字
		String name = pd.getName();
		//判断是否有这个属性
		if (map.containsKey(name)){
			//获取属性的  写的方法
			Method wMethod = pd.getWriteMethod();
			if (pd.getPropertyType() == int.class){
				wMethod.invoke(obj,Integer.valueOf(map.get(name).toString()));
			}else if (pd.getPropertyType() == double.class){
				wMethod.invoke(obj,Double.valueOf(map.get(name).toString()));
			}else {
				wMethod.invoke(obj,map.get(name));
			}
		}
	}
	return obj;
}

2、方式一升级款

//map转换成Bean,只要Map键和JavaBean属性名一致即可,解决mapToBean因为单个首字母大写,映射找不到属性的问题
public static <T, V> T mapToBeanByField(Map<String,V> map,Class<T> clz) throws Exception{
	T obj = clz.newInstance();
	Field field = null;
	V val;
	for(String key : map.keySet()) {
		val = map.get(key);
		field = obj.getClass().getDeclaredField(key);
		field.setAccessible(true);
		field.set(obj, val);
	}
	return obj;
}

3、方式二

/**
        * 实现键值对集合中将对应的键值,赋值给目标对象的属性
        * 前提:键的值必须和目标对象的属性名一致,基本数据类型必须是字符串格式!!!
        * 可以实现任意类型的赋值
 * @param map 键值对集合
 * @param o   要赋值的目标对象
 */
public  static Object copyValue(HashMap<String,Object> map,Object o){
    Class c=o.getClass();  //创建目标对象的class对象
    Field[] fields=c.getDeclaredFields(); //得到目标对象的所有属性
    for (Field f : fields) { //遍历属性集合
        if(map.get(f.getName())!=null){//如果属性名在集合中,有对应的键值对  进入赋值处理
            String methodName="set"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
             //拼接set方法的名字
            try {
                Method m=c.getDeclaredMethod(methodName, f.getType());//创建set方法的method对象
                Object par=map.get(f.getName()); //通过键得到值的对象  执行set方法赋值时 作为参数传递
                Class typeClass=f.getType(); //得到属性的类型的class对象
                if(typeClass.isPrimitive()){ //判断是否为基础数据类型 基础数据类型需要特殊处理
                    String p=(String)par; //所有的基本类型都可以转换为string
                    if("int".equals(typeClass.getName())){ //int的包装类名字特殊 需要单独处理
                        par=Integer.parseInt(p);
                    } else if("char".equals(typeClass.getName())){//char的包装类名字特殊 需要单独处理
                        par=p.charAt(0); //char类型只能存储一个字符  所以直接截取
                    }else{
                        //除了int和char外 其他包装类都是基本类型名首字母大写 可以利用反射调用对应的parse方法 实现转换为基本数据类型
                        String className=typeClass.getName().substring(0,1).toUpperCase()+typeClass.getName().substring(1);
                        //将基本类型名首字母大写 拼接成包装类名
                        Class packageClass=Class.forName("java.lang."+className);//通过类名得到对应的包装类class对象
                    Method parseMethod=packageClass.getDeclaredMethod("parse"+className, String.class);//得到对应的parse方法
                    par= parseMethod.invoke(par, p);//调用parse方法 将字符串转换为对应的基本数据类型
                    }
                }else{        //如果不是基本数据类型  直接调用属性类型的class对象的cast方法 将参数直接强转为,属性类型的对象
                    par=typeClass.cast(par);
                }
                m.invoke(o, par); //执行set方法赋值 par已经是处理完 和属性类型,对应的类型的值
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return o;
}

二、利用反射HashMap转Bean

public static <T,V> List<T> listMapToBean(Map<String, Map<String, HashMap<String, String>>> hashMap,Class<T> clz1,Class<V> clz2) throws Exception {
	List<T> list = new ArrayList<T>();
	Map<String,HashMap<String,String>> hashMapMid = null;
	T c1;
	V c2;
	Field field = null;
	for(String keyOut : hashMap.keySet()) {
		hashMapMid = hashMap.get(keyOut);
		c1 = clz1.newInstance();
		for(String keyMid : hashMapMid.keySet()) {
			c2 = map2bean(hashMapMid.get(keyMid),clz2);
			field = c1.getClass().getDeclaredField(keyMid);
			field.setAccessible(true);
			field.set(c1, c2);
		}
		list.add(c1);
	}
	return list;
}

本文地址:https://blog.csdn.net/guorui_java/article/details/108875459