HashMap转JavaBean

文章介绍了利用Java反射技术,如何将Map转换为Bean,包括两种方法:一种是通过字段名直接赋值,另一种是处理基本数据类型并调用相应setter方法。此外,还提到如何通过映射解决MapToBean中因命名规范问题导致的属性找不到问题。

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

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

} 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 listMapToBean(Map<String, Map<String, HashMap<String, String>>> hashMap,Class clz1,Class clz2) throws Exception {

List list = new ArrayList();

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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
详解,以及其他一些大厂面试题目**

[外链图片转存中…(img-Zcyr0RIB-1713853767749)]

[外链图片转存中…(img-8mqXDz2M-1713853767749)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值