用反射实现JavaBean和Map之间的转换
学习内容:
需求
由于JavaBean结构与Map类似,我们可以把JavaBean与Map进行转换
代码如下:
package com.yy;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* @author YanYang
* @description: 采用单例模式实现
* @date 2021/4/10 13:12
*/
public class JavaBeanChangeMap {
private static final JavaBeanChangeMap javaBeanChangeMap = new JavaBeanChangeMap();
private JavaBeanChangeMap() {
}
public static JavaBeanChangeMap getInstance() {
return javaBeanChangeMap;
}
/**
* JavaBean 转 Map
*/
public <T> Map<String, Object> JavaBeanToMap(Class<T> t) throws IntrospectionException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException {
// 1、创建 Map 集合
Map<String, Object> map = new HashMap<>();
// 2、通过内省机制获取 PropertyDescriptors 属性数组
// Object.class
PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(Person.class, Object.class)
.getPropertyDescriptors();
Constructor<T> constructor = t.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("afa", 12);
System.out.println("obj = " + obj);
// 3、遍历该数组获取 Get 方法,获取属性名作为 key ,获取对象值作为 value
for(PropertyDescriptor propertyDescriptor : propertyDescriptors) {
String name = propertyDescriptor.getName();
Method readMethod = propertyDescriptor.getReadMethod();
Object invoke = readMethod.invoke(obj);
map.put(name, invoke);
}
return map;
}
/**
* Map 转 JavaBean
*/
public <T> T mapToJavaBean(Map map, Class<T> c) throws IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException {
// 1、通过字节码对象创建空的实例
T o = c.newInstance();
// 2、通过 Introspector 类把bean对象信息封装到 beanInfo 中
BeanInfo beanInfo = Introspector.getBeanInfo(c, Object.class);
// 3、通过 getPropertyDescriptors() 获取一个属性(get/set)数组
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
// 4、遍历该数组,把获取的名字作为 map 的 key,通过 key 取出对应的 value 值
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
String key = propertyDescriptor.getName();
Object value = map.get(key);
Method writeMethod = propertyDescriptor.getWriteMethod();
writeMethod.invoke(o, value);
}
return o;
}
}
Junit测试代码:
package com.yy.test;
import com.yy.JavaBeanChangeMap;
import com.yy.Person;
import org.junit.Test;
import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
/**
* @author YanYang
* @description: 测试
* @date 2021/4/10 13:00
*/
public class JavaBeanChangeMapTest {
@Test
public void testJavaBeanToMap() throws Exception {
Map<String, Object> map = JavaBeanChangeMap.getInstance().JavaBeanToMap(Person.class);
System.out.println("map = " + map);
System.out.println("================================");
}
@Test
public void testMapToJavaBean() throws Exception {
Map map = new HashMap();
map.put("name", "afa");
map.put("age", 12);
Person person = JavaBeanChangeMap.getInstance().mapToJavaBean(map, Person.class);
System.out.println("person = " + person);
}
}
运行结果:
"C:\Program Files\Java\jdk-11.0.9\bin\java.exe"
obj = Person{name='afa', age=12}
map = {name=afa, age=12}
================================
person = Person{name='afa', age=12}
Process finished with exit code 0
总结:
反射基础去请看我的上一篇博客:上篇博客地址
用反射实现JavaBean和Map之间的转换的更多相关文章
- JavaBean 和 Map 之间互相转换
JavaBean 和 Map 之间互相转换 import java.beans.BeanInfo; import java.beans.IntrospectionException; import j ...
- 用jackson包实现json、对象、Map之间的转换
jackson API的使用 用jackson包实现json.对象.Map之间的转换
- 基于java反射的javabean和map相互转换的工具类
话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...
- java反射之-Javabean与Map的互转
1.BeanUntils工具类的准备 /** * @ClassName: BeanUtils * @Description: * @Author: songwp * @Date: 9:02 2022/ ...
- 【java】之3种方式实现Object和Map之间的转换
利用commons.BeanUtils实现Obj和Map之间转换,这种是最简单,也是最经常用的 public static Object mapToObject(Map<String, Obje ...
- JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换类
<pre name="code" class="java"></pre><pre name="code" cl ...
- Json,String,Map之间的转换
前提是String的格式是map或json类型的 String 转Json JSONObject jasonObject = JSONObject.fromObject(str); String 转 ...
- List和Map之间的转换和关联
首先,Map.values返回的是此Map中包含的所有值的collection视图. 然后利用ArrayList的构造器ArrayList(Collection<? extends E> ...
- guava处理字符串与List之间,字符串与map之间的转换<转>
import static org.junit.Assert.*; import java.util.List; import java.util.Map; import org.junit.Test ...
随机推荐
- 想了解MQ,读这篇就够了
一.简介 MQ全称为Message Queue-消息队列,是一种应用程序对应用程序的消息通信,一端只管往队列不断发布信息,另一端只管往队列中读取消息,发布者不需要关心读取消息的谁,读取消息者不需要关心 ...
- MATLAB菜鸟入门笔记【作图章】
1.函数标签[legend] http://blog.csdn.net/wangcj625/article/details/6287735/
- 【算法】经典的ML算法(后续结合工作实践完善心得)
18大数据挖掘的经典算法以及代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面,后面都是相应算法的博文链接,希望能够帮助大家学.目前追加了其他的一些经典的DM算法,在others的 ...
- Java入土---基本DOS命令
基本DOS命令 打开cmd方式 开始+系统+命令提示符 win+R,输入cmd 在任意文件夹下,按住shift + 右键,打开命令行窗口 资源管理器里打开 常用DOS命令 盘符切换 E: dir命令查 ...
- 手写 Vue2 系列 之 patch —— diff
前言 上一篇文章 手写 Vue2 系列 之 初始渲染 中完成了原始标签.自定义组件.插槽的的初始渲染,当然其中也涉及到 v-bind.v-model.v-on 指令的原理.完成首次渲染之后,接下来就该 ...
- Linux指令_入门基础
一.基础指令语法 1.ls指令: 用法1:#ls 含义:列出当前工作目录下的所有文件/文件夹的名称. 用法2:#ls 路径 含义:列出指定路径下的所有文件/文件夹的名称 用法3:#ls 选项 路径 含 ...
- 自定义函数实现atoi功能
思路: 列如char a[ ] ="123" "1" "2" "3' "\0" 首先遍历这个字符串 知道这个字 ...
- 4月23日 python学习总结 套接字UDP和 操作系统理论,多道理论
一.套接字UDP udp是无链接的,先启动哪一端都不会报错 UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务.不会使用块的合并优化算法,, ...
- linux的文件与目录的权限设置
@font-face { font-family: 宋体 } @font-face { font-family: "Cambria Math" } @font-face { fon ...
- mycat分库分表 看这一篇就够了
之前我们已经讲解过了数据的切分,主要有两种方式,分别是垂直切分和水平切分,所谓的垂直切分就是将不同的表分布在不同的数据库实例中,而水平切分指的是将一张表的数据按照不同的切分规则切分在不同实例的相同 ...