HashMap转JavaBean,深入剖析

本文深入探讨了两种将HashMap转换为JavaBean的方法,包括方式一的升级版和方式二的详细步骤,揭示了在Java后端开发中进行此类转换的关键技术和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//把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;

	for(String key : map.keySet()) {

		field = obj.getClass().getDeclaredField(key);

		field.setAccessible(true);

		field.set(obj, map.get(key));

	}

	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);

                }



### 架构学习资料?

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/6649d00f5c3ea47024a52d8692aa177d.png)

![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/b92a769559acad53cbaed8b442900cf1.png)

![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/03bdd347f0206b58937f9c0c2e288ac4.png)

![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/76adf9eeb334e3239848133cbe73d7f0.png)

![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/fddb5d689f6351e2b00f8e9cb94f9b41.png)

> 由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
850224)]

[外链图片转存中...(img-cxVAyymD-1630459850225)]

[外链图片转存中...(img-D6Q0PXrC-1630459850226)]

[外链图片转存中...(img-KNpTGerN-1630459850228)]

> 由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值