一、HashMap转JavaBean
1、方式一 
//把Map转化为JavaBean
public static T map2bean(Map<String,Object> map,Class 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 populate(Map<String, Object> map, Class 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 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);
    field.setAccessible(true);
    field.set(c1, c2);
    }
    list.add(c1);
    }
    return list;
    }
     
    ————————————————
    版权声明:本文为CSDN博主「GooReey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/guorui_java/article/details/108875459

HashMap转JavaBean相关推荐

  1. mybatis foreach map_Spring Boot(五):春眠不觉晓,Mybatis知多少

    在JavaWeb项目开发中,我们使用最多的ORM框架可能就是Mybatis了,那么对于常用的mybatis,你究竟了解多少呢? Mybatis是什么 MyBatis 是支持定制化 SQL.存储过程以及 ...

  2. 综合技术 --myBatis理解

    2019独角兽企业重金招聘Python工程师标准>>> myBatis是一个基于java的持久层框架,它提供的持久层框架包括 SQL Maps和Data Access Objesct ...

  3. java中集合和数据库中_java中list集合的内容,如何使用像数据库中group by形式那样排序...

    标签:java中list集合的内容,如何使用像数据库中group by形式那样排序,比如: 有一个 List 他中包含了一些如下的内容 JavaBean: name    money (名称)  (金 ...

  4. 原理分析之二:框架整体设计

    1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 ...

  5. MyBatis的框架架构设计是怎么样的?

    这张图从上往下看.MyBatis的初始化,会从mybatis-config.xml配置文件,解析构造成Configuration这个类,就是图中的红框. (1)加载配置:配置来源于两个地方,一处是配置 ...

  6. mysql及mybatis知识点_MyBatis知识点详解

    一:概述 一.概念 1. MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架. 2. MyBatis 可以使用XML或注解将接口和Java的POJO映射成数据库中的记录. 二. ...

  7. MyBatis --教程

    2019独角兽企业重金招聘Python工程师标准>>> 本文参考如下这篇优秀文章 http://www.yihaomen.com/article/java/302.htm 一.什么是 ...

  8. mybatis 映射成多个list_SSM:Mybatis架构与原理

    MyBatis功能架构设计 功能架构讲解: 我们把Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数 ...

  9. MyBatis入门(一) -- 简介

    2019独角兽企业重金招聘Python工程师标准>>> MyBatis 提供了一种"半自动化"的 ORM 实现,是一种 "SQL Mapping&quo ...

最新文章

  1. 第三届北京智源大会开幕,全球最大智能模型“悟道2.0”重磅发布
  2. c语言 free参数 指针,C语言之free函数以及野指针介绍
  3. 【ZJOI 2008】树的统计 Count
  4. jQuery复选框选中状态更改事件
  5. [Java] System.arraycopy 数组复制
  6. nginx php mysql 部署_Linux+Nginx+Mysql+Php运维部署
  7. python模块下载1002python模块下载_【Python】Python的urllib模、urllib2模块的网络下载文件...
  8. 如何使用IVT BlueSoleil 如何在电脑上使用蓝牙耳机
  9. Remote Desktop Manager for Mac(远程桌面管理)
  10. Mac m1安装java jdk maven
  11. 有赞云支付php接口,Erphpdown wordpress插件集成有赞云支付的接口申请方法
  12. WIFI 2.4G及5G信道一览表
  13. 清代徽州家政与乡族社会的善治
  14. 【qq机器人】王者英雄问题查询
  15. 噩梦射手(SurvivalShooter)教程(一)
  16. 使用PHP实现蜘蛛访问日志统计
  17. PVLAN 技术介绍
  18. Android11 Launcher添加网格布局设置(3x3,4x4,5x5)
  19. 【强化学习】Asynchronous Advantage Actor-Critic(A3C)
  20. IP地址0.0.0.0表示什么

热门文章

  1. 选择在何处重构(下)
  2. node mysql查询回调_nodejs 数据库查询回调问题
  3. java jws-_为JWS应用程序启动指定JRE位置
  4. 线程安全的量化时间帧环形缓冲区
  5. 实现机器学习的循序渐进指南II——决策树
  6. Redis:复制,第3部分——redis-py和Python中的Redi哨兵一起使用
  7. 应用挂载beegfs指定目录_BeeGFS源码分析1-元数据服务概要分析
  8. 100m光纤测速多少正常_光纤收发器的分类知识详解
  9. 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题
  10. vue webapp滑动事件_js_监听移动端web触屏事件_滑动响应