IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> BeanToMap or MapToBean -> 正文阅读

[Java知识库]BeanToMap or MapToBean

之前也写过BeanToMap、MapToBean的工具类,但这次算是了结了。

玩MapToBean、BeanToMap少不了反射和内省!

没错,就是你很熟悉的内容。

一、运行展示

1.1 先看JavaBean

在这里插入图片描述

1.2 再看运行代码

在这里插入图片描述

1.3 运行展示

在这里插入图片描述

二、代码解析

在这里插入图片描述

三、源代码

3.1 Student.java

package com.rt.pojo;

import java.sql.Date;

public class Student {
    private Integer studentId;
    private String name;
    private Integer age;
    private String gender;
    private Date birthdate;
    private String grade;//年级

    public Student(Integer studentId, String name, Integer age, String gender, Date birthdate, String grade) {
        this.studentId = studentId;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.birthdate = birthdate;
        this.grade = grade;
    }

    public Student() {
    }

    public Integer getStudentId() {
        return studentId;
    }

    public void setStudentId(Integer studentId) {
        this.studentId = studentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getBirthdate() {
        return birthdate;
    }

    public void setBirthdate(Date birthdate) {
        this.birthdate = birthdate;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    @Override
    public String toString()
    {
        return "Student{" +
                "studentId=" + studentId +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", birthdate=" + birthdate +
                ", grade='" + grade + '\'' +
                '}';
    }
}

3.2 BeanUtility.java

package com.rt.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class BeanUtility
{

    private static final Map<String, List<Field>> fieldListMap;//用作缓冲
    //beanClass的全限定类名字符串为Key,
    //装载beanClass的所有Field对象的List集合为Value
    static{
        fieldListMap=new TreeMap<>();
    }

    //将BeanClass中的所有Field对象装载在List集合中,并由方法返回
    private static List<Field> getBeanClassField(Class beanClass)  {
        if(fieldListMap.containsKey(beanClass.getName()))//如果fieldListMap的Key中已经存储过beanClass的全限定类名
        {
            System.out.println("Leave it alone--------from fieldListMap-------");
            return fieldListMap.get(beanClass.getName());//那么直接由fieldListMap返回装载beanClass所有Field对象的List集合
        }
        List<Field> fieldList = null;
        Method writeMethod;
        Method readMethod;
        Field beanClassField;
        String beanClassFieldName;
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            fieldList = new ArrayList<>();
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                readMethod = propertyDescriptor.getReadMethod();
                writeMethod = propertyDescriptor.getWriteMethod();
                if (readMethod != null && writeMethod != null) //排除getClass()方法
                {
                    beanClassFieldName = propertyDescriptor.getName();
                    beanClassField = beanClass.getDeclaredField(beanClassFieldName);
                    beanClassField.setAccessible(true);
                    fieldList.add(beanClassField);
                }
            }
        } catch (IntrospectionException | NoSuchFieldException e) {
            e.printStackTrace();
        }
        fieldListMap.put(beanClass.getName(),fieldList);
        return fieldList;
    }

    //beanMap中的Key必须要与BeanClass中的Field名称,一一对应
    public static <T> T mapToBean(Map<String,Object> beanMap,Class<T> beanClass) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException
    {
        if(beanMap.isEmpty())
            return null;
        List<Field> fieldList = getBeanClassField(beanClass);
        T beanObject = beanClass.getConstructor().newInstance();
        for (Field field : fieldList)
        {
            field.set(beanObject,beanMap.get(field.getName()));
        }
        return beanObject;
    }

    public static <T> Map<String,Object> beanToMap(T beanObject) throws IllegalAccessException {
        List<Field> fieldList = getBeanClassField(beanObject.getClass());
        Map<String, Object> beanMap = new TreeMap<>();
        for (Field field : fieldList)
        {
            beanMap.put(field.getName(),field.get(beanObject));
        }
        return beanMap;
    }

}

3.3 BeanUtilityTest.java

 package com.rt.test;

import com.rt.pojo.Student;
import com.rt.util.BeanUtility;
import org.junit.Test;
import java.sql.Date;
import java.util.Map;
import java.util.Set;

public class BeanUtilityTest {

    @Test
    public void test1() throws Exception {
        Student student = new Student();
        student.setStudentId(2022001);
        student.setName("杨甜甜");
        student.setAge(24);
        student.setGender("male");
        student.setBirthdate(Date.valueOf("1993-10-03"));
        student.setGrade("三年级");

        System.out.println("--------------------------beanToMap--------------------------");
        Map<String, Object> beanToMap = BeanUtility.beanToMap(student);
        Set<Map.Entry<String, Object>> entries = beanToMap.entrySet();
        for (Map.Entry<String, Object> entry : entries) {
            System.out.println(entry.getKey()+"\t"+entry.getValue());
        }

        System.out.println("--------------------------mapToBean--------------------------");
        Student bean = BeanUtility.mapToBean(beanToMap, student.getClass());
        System.out.println(bean);

    }
}

四、完结撒花

勤能补拙!熟能生巧!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:04:09  更:2022-05-05 11:04:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:13:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码