HashMap转JavaBean
一、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相关推荐
- mybatis foreach map_Spring Boot(五):春眠不觉晓,Mybatis知多少
在JavaWeb项目开发中,我们使用最多的ORM框架可能就是Mybatis了,那么对于常用的mybatis,你究竟了解多少呢? Mybatis是什么 MyBatis 是支持定制化 SQL.存储过程以及 ...
- 综合技术 --myBatis理解
2019独角兽企业重金招聘Python工程师标准>>> myBatis是一个基于java的持久层框架,它提供的持久层框架包括 SQL Maps和Data Access Objesct ...
- java中集合和数据库中_java中list集合的内容,如何使用像数据库中group by形式那样排序...
标签:java中list集合的内容,如何使用像数据库中group by形式那样排序,比如: 有一个 List 他中包含了一些如下的内容 JavaBean: name money (名称) (金 ...
- 原理分析之二:框架整体设计
1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化 触发条件:加载配置文件 ...
- MyBatis的框架架构设计是怎么样的?
这张图从上往下看.MyBatis的初始化,会从mybatis-config.xml配置文件,解析构造成Configuration这个类,就是图中的红框. (1)加载配置:配置来源于两个地方,一处是配置 ...
- mysql及mybatis知识点_MyBatis知识点详解
一:概述 一.概念 1. MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架. 2. MyBatis 可以使用XML或注解将接口和Java的POJO映射成数据库中的记录. 二. ...
- MyBatis --教程
2019独角兽企业重金招聘Python工程师标准>>> 本文参考如下这篇优秀文章 http://www.yihaomen.com/article/java/302.htm 一.什么是 ...
- mybatis 映射成多个list_SSM:Mybatis架构与原理
MyBatis功能架构设计 功能架构讲解: 我们把Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数 ...
- MyBatis入门(一) -- 简介
2019独角兽企业重金招聘Python工程师标准>>> MyBatis 提供了一种"半自动化"的 ORM 实现,是一种 "SQL Mapping&quo ...
最新文章
- 第三届北京智源大会开幕,全球最大智能模型“悟道2.0”重磅发布
- c语言 free参数 指针,C语言之free函数以及野指针介绍
- 【ZJOI 2008】树的统计 Count
- jQuery复选框选中状态更改事件
- [Java] System.arraycopy 数组复制
- nginx php mysql 部署_Linux+Nginx+Mysql+Php运维部署
- python模块下载1002python模块下载_【Python】Python的urllib模、urllib2模块的网络下载文件...
- 如何使用IVT BlueSoleil 如何在电脑上使用蓝牙耳机
- Remote Desktop Manager for Mac(远程桌面管理)
- Mac m1安装java jdk maven
- 有赞云支付php接口,Erphpdown wordpress插件集成有赞云支付的接口申请方法
- WIFI 2.4G及5G信道一览表
- 清代徽州家政与乡族社会的善治
- 【qq机器人】王者英雄问题查询
- 噩梦射手(SurvivalShooter)教程(一)
- 使用PHP实现蜘蛛访问日志统计
- PVLAN 技术介绍
- Android11 Launcher添加网格布局设置(3x3,4x4,5x5)
- 【强化学习】Asynchronous Advantage Actor-Critic(A3C)
- IP地址0.0.0.0表示什么
热门文章
- 选择在何处重构(下)
- node mysql查询回调_nodejs 数据库查询回调问题
- java jws-_为JWS应用程序启动指定JRE位置
- 线程安全的量化时间帧环形缓冲区
- 实现机器学习的循序渐进指南II——决策树
- Redis:复制,第3部分——redis-py和Python中的Redi哨兵一起使用
- 应用挂载beegfs指定目录_BeeGFS源码分析1-元数据服务概要分析
- 100m光纤测速多少正常_光纤收发器的分类知识详解
- 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题
- vue webapp滑动事件_js_监听移动端web触屏事件_滑动响应