学习内容:

需求
由于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之间的转换的更多相关文章

  1. JavaBean 和 Map 之间互相转换

    JavaBean 和 Map 之间互相转换 import java.beans.BeanInfo; import java.beans.IntrospectionException; import j ...

  2. 用jackson包实现json、对象、Map之间的转换

    jackson API的使用 用jackson包实现json.对象.Map之间的转换

  3. 基于java反射的javabean和map相互转换的工具类

    话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...

  4. java反射之-Javabean与Map的互转

    1.BeanUntils工具类的准备 /** * @ClassName: BeanUtils * @Description: * @Author: songwp * @Date: 9:02 2022/ ...

  5. 【java】之3种方式实现Object和Map之间的转换

    利用commons.BeanUtils实现Obj和Map之间转换,这种是最简单,也是最经常用的 public static Object mapToObject(Map<String, Obje ...

  6. JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换类

    <pre name="code" class="java"></pre><pre name="code" cl ...

  7. Json,String,Map之间的转换

    前提是String的格式是map或json类型的 String 转Json JSONObject  jasonObject = JSONObject.fromObject(str); String 转 ...

  8. List和Map之间的转换和关联

    首先,Map.values返回的是此Map中包含的所有值的collection视图. 然后利用ArrayList的构造器ArrayList(Collection<? extends E> ...

  9. guava处理字符串与List之间,字符串与map之间的转换<转>

    import static org.junit.Assert.*; import java.util.List; import java.util.Map; import org.junit.Test ...

随机推荐

  1. 网络标准之:永远是1.0版本的MIME

    目录 简介 MIME详解 MIME头 MIME-Version Content-Type Content-Disposition Content-Transfer-Encoding Encoded-W ...

  2. Angular依赖注入:全面讲解(翻译中)

    在实际使用Angular依赖注入系统时,你需要知道的一切都在本文中.我们将以实用易懂并附带示例的形式解释它的所有高级概念. Angular最强大.最独特的功能之一就是它内置的依赖注入系统. 大多数时候 ...

  3. 『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)

    目录 9.ids参数说明 10.name参数说明 11.scope参数说明 (1)scope="function" (2)scope="class" (3)sc ...

  4. 小程序 laravel 实现秒杀

    参考博客: https://blog.csdn.net/m0_56487875/article/details/118603439 小程序登录: https://www.cnblogs.com/xia ...

  5. SQLMAP-Tamper之较为通用的双写绕过

    前言 21年省决赛的SQLITE注入就是用的双写绕过,当时是手搓代码打的,这几天想起来了,寻思着写个tamper试试. 一开始以为很简单,后来才发现有很多要注意的点,折磨了挺久. 等弄完才明白为什么s ...

  6. kkFileView对接svn服务完成文件在线预览功能

    1.需求: 之前在公司内部搭建了svn服务器,给部门存放文档.视频,做成了一个文档服务器来用,随着视频文件太大,每次下载太慢 需要把文件在线打开查看 2.解决: kkFileView https:// ...

  7. Chrome浏览器打开图标显示空白

    复制下面命令存到.bat 文件中,并允许bat文件 taskkill /f /im explorer.exeattrib -h -i %userprofile%\AppData\Local\IconC ...

  8. mysql 聚集索引和非聚集索引

    聚集索引:聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大: 非聚集索引:非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位 ...

  9. Win10开启FTP与配置(完整无错版)

    #1.控制面板>程序>启用或关闭Windows功能>-(控制面板可在 桌面右键>个性化>主题>桌面图标设置>勾选控制面板>确定) #2.小娜搜索IIS打 ...

  10. 有关电控制图软件EPLAN的安装,下面有破解版本2.7

    前段时间刚刚接触这一块,就安装个软件老是出问题,所以我通过自己的努力学会啦,来给正要学习EPLAN的同学发福利啦 15:07:48 安装包发放在百度网盘来自取呀  建议安装我勾选的这个哦 链接:htt ...