最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Bean與Map轉(zhuǎn)換的幾種方式

 更新時(shí)間:2025年10月09日 10:17:01   作者:拂曉銀礫  
Java Bean與Map轉(zhuǎn)換的幾種方式,包括反射,內(nèi)省,cglib,huTool,cglib動(dòng)態(tài)代理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

pom文件

<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>cglib</groupId>-->
<!--            <artifactId>cglib</artifactId>-->
<!--            <version>3.3.0</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.15</version>
        </dependency>
    </dependencies>

java代碼

package com.example.service;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import org.springframework.beans.BeanUtils;
import org.springframework.cglib.beans.BeanGenerator;
import org.springframework.cglib.beans.BeanMap;

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.HashMap;
import java.util.Map;

/**
 * description:
 * Bean 和 Map相互轉(zhuǎn)換
 *
 * @author DawnStar
 * date: 2023/5/31
 */
public class BeanMapTransform {
    public static void main(String[] args) {
        AnimeBean animeBean = new AnimeBean();
        animeBean.setRoleName("加藤惠");
        animeBean.setAge(18);

        Map<String, Object> properties = new HashMap<>(2);
        properties.put("roleName", "加藤惠");
        properties.put("age", 18);
        System.out.println("-----------------------反射----------------------------------");
        reflectMapToBean(AnimeBean.class, properties);
        System.out.println("-----------------------內(nèi)省----------------------------------");
        introspectToBean(AnimeBean.class, properties);
        System.out.println("----------------------huTool----------------------------------");
        huToolMapToBean(AnimeBean.class, properties);
        System.out.println("----------------------BeanUtils----------------------------------");
        beanUtilsMapToBean(AnimeBean.class, properties);
        System.out.println("----------------------CGlib----------------------------------");
        // 動(dòng)態(tài)添加字段
        properties.put("animeName", "路人女主的養(yǎng)成方法");
        // 沒(méi)有使用 BeanGenerator
        cglibMapToBean(AnimeBean.class, properties);
        System.out.println("----------------------動(dòng)態(tài)添加字段屬性----------------------------------");
        Map<String, Object> properties1 = new HashMap<>(2);
        // 動(dòng)態(tài)添加字段
        properties.put("animeName", "路人女主的養(yǎng)成方法");
        cglibDynamicMapToBean(animeBean, properties1);
    }

    /**
     * 通過(guò)反射生成一個(gè)map
     */
    private static void reflectBeanToMap(Object sourceObject) {
        Map<String, Object> map = new HashMap<>();
        try {
            for (Field declaredField : sourceObject.getClass().getDeclaredFields()) {
                // 私有屬性可訪問(wèn)
                declaredField.setAccessible(true);
                Object o = declaredField.get(sourceObject);
                String name = declaredField.getName();
                map.put(name, o);
            }
            printMap(map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通過(guò)反射生成一個(gè)bean
     *
     * @param clazz         指定類
     * @param propertiesMap 屬性值
     */
    private static void reflectMapToBean(Class<?> clazz, Map<String, Object> propertiesMap) {
        try {
            Object targetObject = clazz.newInstance();
            for (Field declaredField : clazz.getDeclaredFields()) {
                // 私有屬性可訪問(wèn)
                declaredField.setAccessible(true);
                declaredField.set(targetObject, propertiesMap.get(declaredField.getName()));
            }
            reflectBeanToMap(targetObject);
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 通過(guò)自省的方式 beanToMap
     *
     * @param sourceObject 源對(duì)象
     */
    private static void introspectToMap(Object sourceObject) {
        try {
            // 減少一個(gè)class屬性
            BeanInfo beanInfo = Introspector.getBeanInfo(sourceObject.getClass(), Object.class);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            Map<String, Object> map = new HashMap<>(propertyDescriptors.length);
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                String name = propertyDescriptor.getName();
                Method readMethod = propertyDescriptor.getReadMethod();
                Object invoke = readMethod.invoke(sourceObject);
                map.put(name, invoke);
            }
            printMap(map);
        } catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * Map 轉(zhuǎn) bean
     *
     * @param clazz         傳入的類型
     * @param propertiesMap 屬性map
     */
    private static void introspectToBean(Class<?> clazz, Map<String, Object> propertiesMap) {
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
            Object sourceObject = clazz.newInstance();
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                Method writeMethod = propertyDescriptor.getWriteMethod();
                writeMethod.invoke(sourceObject, propertiesMap.get(propertyDescriptor.getName()));
            }
            introspectToMap(sourceObject);
        } catch (IntrospectionException | InvocationTargetException | IllegalAccessException |
                 InstantiationException e) {
            throw new RuntimeException(e);
        }
    }

    private static void huToolBeanToMap(Object sourceObject) {
        Map<String, Object> map = BeanUtil.beanToMap(sourceObject, false, false);
        printMap(map);
    }

    private static void huToolMapToBean(Class<?> clazz, Map<String, Object> propertiesMap) {
        Object bean = BeanUtil.mapToBean(propertiesMap, clazz, false, CopyOptions.create());
        huToolBeanToMap(bean);

    }


    private static void beanUtilsBeanToMap(Object sourceObject) {
        Map<String, Object> map = new HashMap<>();
        try {
            PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(sourceObject.getClass());
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                if ("class".equals(propertyDescriptor.getName())) {
                    continue;
                }
                String name = propertyDescriptor.getName();
                Method readMethod = propertyDescriptor.getReadMethod();
                Object invoke = readMethod.invoke(sourceObject);
                map.put(name, invoke);
            }
            printMap(map);
        } catch (InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    private static void beanUtilsMapToBean(Class<?> clazz, Map<String, Object> propertiesMap) {
        try {
            Object newInstance = clazz.newInstance();
            PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(clazz);

            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                if ("class".equals(propertyDescriptor.getName())) {
                    continue;
                }
                Method writeMethod = propertyDescriptor.getWriteMethod();
                writeMethod.invoke(newInstance, propertiesMap.get(propertyDescriptor.getName()));
            }
            cglibBeanToMap(newInstance);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    private static void cglibMapToBean(Class<?> clazz, Map<String, Object> propertiesMap) {
        try {
            Object instance = clazz.newInstance();
            BeanMap beanMap = BeanMap.create(instance);
            beanMap.putAll(propertiesMap);
            Object bean = beanMap.getBean();
            System.out.println(bean);
            reflectBeanToMap(bean);
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    private static void cglibBeanToMap(Object sourceObject) {
        BeanMap beanMap = BeanMap.create(sourceObject);
        printMap(beanMap);
    }


    /**
     * 動(dòng)態(tài)給實(shí)體類添加字段
     *
     * @param sourceObject  類型
     * @param propertiesMap 屬性映射
     */
    private static void cglibDynamicMapToBean(Object sourceObject, Map<String, Object> propertiesMap) {
        Map<String, Class<?>> propertyMap = new HashMap<>();
        PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(sourceObject.getClass());
        try {
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                if (!"class".equalsIgnoreCase(propertyDescriptor.getName())) {
                    propertyMap.put(propertyDescriptor.getName(), propertyDescriptor.getPropertyType());
                    String name = propertyDescriptor.getName();
                    Method readMethod = propertyDescriptor.getReadMethod();
                    Object invoke = readMethod.invoke(sourceObject);
                    propertiesMap.put(name, invoke);
                }
            }
            DynamicBean dynamicBean = new DynamicBean(sourceObject.getClass(), propertyMap);
            dynamicBean.setProperties(propertiesMap);
            Object targetObject = dynamicBean.getTargetObject();

            Field[] declaredFields = targetObject.getClass().getDeclaredFields();
            for (Field declaredField : declaredFields) {
                declaredField.setAccessible(true);
                System.out.println(declaredField.getName());
                Object o1 = declaredField.get(targetObject);
                System.out.println(o1);
            }
            System.out.println(targetObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private static void printMap(Map<String, Object> map) {
        map.forEach((k, v) -> System.out.println(k + ": " + v));
    }

    static class DynamicBean {
        private Object targetObject;
        private BeanMap beanMap;

        public DynamicBean(Class<?> clazz, Map<String, Class<?>> propertyMap) {
            this.targetObject = generateBean(clazz, propertyMap);
            this.beanMap = BeanMap.create(targetObject);
        }

        public Object getTargetObject() {
            return targetObject;
        }


        /**
         * bean 添加屬性和值
         *
         * @param key   屬性
         * @param value 對(duì)應(yīng)鍵的值
         */
        public void setValue(String key, Object value) {
            beanMap.put(key, value);
        }

        /**
         * 獲取屬性值
         *
         * @param property 屬性
         * @return 獲取屬性的值
         */
        public Object getValue(String property) {
            return beanMap.get(property);
        }

        public void setProperties(Map<String, Object> propertyMap) {
            beanMap.putAll(propertyMap);
        }

        private Object generateBean(Class<?> superclass, Map<String, Class<?>> propertyMap) {
            BeanGenerator generator = new BeanGenerator();
            if (null != superclass) {
                generator.setSuperclass(superclass);
            }
            BeanGenerator.addProperties(generator, propertyMap);
            return generator.create();
        }

    }

    static class AnimeBean {
        private String roleName;
        private Integer age;

        public String getRoleName() {
            return roleName;
        }

        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }

        public Integer getAge() {
            return age;
        }

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

到此這篇關(guān)于Java Bean與Map轉(zhuǎn)換的幾種方式的文章就介紹到這了,更多相關(guān)Java Bean與Map轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot如何加載多個(gè)YAML配置文件

    SpringBoot如何加載多個(gè)YAML配置文件

    在Spring?Boot中加載多個(gè)?YAML?配置文件是一個(gè)常見(jiàn)的需求,通常用于將配置信息分離到多個(gè)文件中以便于管理和維護(hù),下面就跟隨小編一起來(lái)看看具體實(shí)現(xiàn)吧
    2025-02-02
  • java讀取JSON文件的多種實(shí)現(xiàn)方式

    java讀取JSON文件的多種實(shí)現(xiàn)方式

    這篇文章主要介紹了java讀取JSON文件的多種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • spring 整合JDBC和AOP事務(wù)的方法

    spring 整合JDBC和AOP事務(wù)的方法

    這篇文章主要介紹了spring 整合JDBC和AOP事務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java實(shí)現(xiàn)文件圖片的預(yù)覽和下載功能

    Java實(shí)現(xiàn)文件圖片的預(yù)覽和下載功能

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)文件圖片的預(yù)覽和下載功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Java之邏輯控制三大結(jié)構(gòu)使用及說(shuō)明

    Java之邏輯控制三大結(jié)構(gòu)使用及說(shuō)明

    文章介紹了Java中的邏輯控制結(jié)構(gòu),包括順序執(zhí)行、選擇執(zhí)行(if和switch語(yǔ)句)和循環(huán)執(zhí)行(while、for和do-while循環(huán)),此外,還討論了輸入輸出和一個(gè)簡(jiǎn)單的猜數(shù)字游戲
    2025-12-12
  • 通過(guò)JDK源碼學(xué)習(xí)InputStream詳解

    通過(guò)JDK源碼學(xué)習(xí)InputStream詳解

    InputStream抽象類是所有字節(jié)輸入流的類的超類。這篇文章主要給大家介紹了關(guān)于通過(guò)JDK源碼學(xué)習(xí)InputStream的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • jar的MANIFEST.MF配置Class-Path, java -classpath設(shè)置無(wú)效的解決

    jar的MANIFEST.MF配置Class-Path, java -classpath設(shè)置無(wú)效的解

    這篇文章主要介紹了jar的MANIFEST.MF配置Class-Path, java -classpath設(shè)置無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 淺談Java對(duì)象禁止使用基本類型

    淺談Java對(duì)象禁止使用基本類型

    本文主要介紹了淺談Java對(duì)象禁止使用基本類型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法

    Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法

    這篇文章主要給大家介紹了關(guān)于Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java 類型信息詳解和反射機(jī)制介紹

    Java 類型信息詳解和反射機(jī)制介紹

    這篇文章主要介紹了Java 類型信息詳解和反射機(jī)制介紹,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

炉霍县| 南陵县| 辉县市| 北宁市| 武平县| 樟树市| 会昌县| 汉阴县| 福贡县| 晋中市| 霍邱县| 紫云| 葫芦岛市| 山东| 分宜县| 临桂县| 江华| 伊金霍洛旗| 阿巴嘎旗| 白河县| 南通市| 青阳县| 凭祥市| 孟州市| 广水市| 无棣县| 临泉县| 咸宁市| 钟山县| 湘潭市| 磐石市| 泾源县| 祥云县| 龙南县| 东海县| 定襄县| 开远市| 林州市| 棋牌| 开阳县| 牡丹江市|