学习内容:

需求
由于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. java 注释与标识符

    JAVA基础 注释与标识符 注释 书写注释是一个非常好的习惯 三种注释: 单行,多行,文档 .单行 ://注释 .多行:/* 注释 / .文档** 注释 */ 标识符 1. 关键字 2.标识符注意点 ...

  2. CDN网络科普小文(小说版)

    引言 作为公司 cdn 小组的一名小码仔,我为写一篇 cdn 的科普文章准备了好一段时间(大概有一个多月没有更新我的社交账号了). 在我刚进入公司,培训完,进入小组,了解到我们做的是 cdn 相关的工 ...

  3. xshell + xftp 安装及1603错误解决

    xshell + xftpan下载安装 百度网盘下载链接:https://pan.baidu.com/s/14orvEWDjFkrLvr_9JaG4Gw 提取码:om9z 下载地址 https://w ...

  4. CSS 选择器学习总结

    1.id 选择器 #idname{color:red;} 2.class选择器 .classname{} 3.标签选择器 div{} 4.通配符选择器 *{} 5. 属性选择器 [id]{ } 5.选 ...

  5. php——新闻项目改写

    主要思路:遵守java开发规范,保持接口一致性 如何保持接口的一致性: (1).url的一致性:使用@RequestingMapping注解 (2).参数的一致性: 使用@ReuqestParam注解 ...

  6. 软路由openwrt中替换国内镜像源(以阿里云为例)

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 一.打开openwrt终端 二.找到distfeeds.conf 进入opkg cd /etc/opkg 查看opkg内文件 ls 可以找到di ...

  7. knife4j只用此插件的最简洁开发方式

    一.POM添加 在pom文件里添加包 1 <!--引入knife4j以来--> 2 <dependency> 3 <groupId>com.github.xiaoy ...

  8. c# / .net wFramework winform 之运行后的窗体窗口可拖动操作

    学习winform 的同志们可能会有这样的提问,我运行起来的窗体或者窗口该如何实现可拖动呢?今天它来了 思路:可以给窗体增加一个进度条(progressBar控件) 全局定义这几个变量: long p ...

  9. C# XML基础入门(XML文件内容增删改查清)

    前言: 最近对接了一个第三方的项目,该项目的数据传输格式是XML.由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后就几乎没有接触过了.因此对于XML这块自己感觉还是有很多盲 ...

  10. 羽夏看Win系统内核—— x64 番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...