欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java BeanMap實現(xiàn)Bean與Map的相互轉換

 更新時間:2022年11月20日 10:16:24   作者:氵奄不死的魚  
這篇文章主要介紹了利用BeanMap進行對象與Map的相互轉換,通過net.sf.cglib.beans.BeanMap類中的方法來轉換,效率極高,本文給大家分享實現(xiàn)代碼,感興趣的朋友一起看看吧

net.sf.cglib.beans.BeanMap用法

bean轉Map

@Data
public class Student {
    private int id;
    private String name;
    private Integer age;
}
    Student student = new Student();
    BeanMap beanMap = BeanMap.create(student);

此時的beanMap就是一個map類型

但是對于直接生成的beanMap無法添加key,也無法刪除key(會報錯),并且修改值會直接影響到student這個對象。

如果有這個需求可以再進一步轉換為HashMap(如果沒這個需要,就不要再轉換,避免不必要的性能浪費)

HashMap map = new HashMap();
map.putAll(beanMap);

map轉Bean

普通Map轉轉換成bean

        HashMap map = new HashMap();
        map.put("name","hello world");   
        Student student = new Student();
        BeanMap beanMap = BeanMap.create(student);
        beanMap.putAll(map);

利用了修改beanMap會影響bean的特性,將map put到beanMap完成轉換.

beanMap轉成對應的bean

public static <T> T beanMapToBean(BeanMap beanMap) {
        if (beanMap == null) {
            throw new DataStreamException("bean.can.not.be.null");
        }
        return (T) beanMap.getBean();
    }

直接調用getBean方法就可以獲取beanMap對應的bean

beanMap實現(xiàn)以及高性能的原因

先看beanMap

public abstract class BeanMap implements Map 

繼承自Map接口,實現(xiàn)了contains,remove,put,get等操作

    public Object remove(Object key) {
        throw new UnsupportedOperationException();
    }

但是remove會拋出UnsupportedOperationException

BeanMap.create()方法通過asm動態(tài)生成字節(jié)碼創(chuàng)建一個beanMap

那么我們來看看創(chuàng)建出來的beanMap的字節(jié)碼文件

import java.math.BigDecimal;
import java.util.Date;
import java.util.Set;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.beans.FixedKeySet;
public class Student$$BeanMapByCGLIB$$54bf0fe9 extends BeanMap {
    private static FixedKeySet keys;
    private static final Class CGLIB$load_class$java$2Eutil$2ESet;
    private static final Class CGLIB$load_class$java$2Elang$2EInteger;
    private static final Class CGLIB$load_class$java$2Elang$2EString;
    private static final Class CGLIB$load_class$java$2Emath$2EBigDecimal;
    private static final Class CGLIB$load_class$java$2Eutil$2EDate;
    public Student$$BeanMapByCGLIB$$54bf0fe9() {
    }
    public BeanMap newInstance(Object var1) {
        return new Student$$BeanMapByCGLIB$$54bf0fe9(var1);
    }
    public Student$$BeanMapByCGLIB$$54bf0fe9(Object var1) {
        super(var1);
    }
    public Object get(Object var1, Object var2) {
        Student var10000 = (Student)var1;
        String var10001 = (String)var2;
        switch(((String)var2).hashCode()) {
        case -600094315:
            if (var10001.equals("friends")) {
                return var10000.getFriends();
            }
            break;
        case 3355:
            if (var10001.equals("id")) {
                return new Integer(var10000.getId());
            }
            break;
        case 96511:
            if (var10001.equals("age")) {
                return var10000.getAge();
            }
            break;
        case 3373707:
            if (var10001.equals("name")) {
                return var10000.getName();
            }
            break;
        case 104079552:
            if (var10001.equals("money")) {
                return var10000.getMoney();
            }
            break;
        case 1069376125:
            if (var10001.equals("birthday")) {
                return var10000.getBirthday();
            }
        }
        return null;
    }
    public Object put(Object var1, Object var2, Object var3) {
        Student var10000 = (Student)var1;
        String var10001 = (String)var2;
        switch(((String)var2).hashCode()) {
        case -600094315:
            if (var10001.equals("friends")) {
                Set var7 = var10000.getFriends();
                var10000.setFriends((Set)var3);
                return var7;
            }
            break;
        case 3355:
            if (var10001.equals("id")) {
                Integer var10003 = new Integer(var10000.getId());
                var10000.setId(((Number)var3).intValue());
                return var10003;
            }
            break;
        case 96511:
            if (var10001.equals("age")) {
                Integer var6 = var10000.getAge();
                var10000.setAge((Integer)var3);
                return var6;
            }
            break;
        case 3373707:
            if (var10001.equals("name")) {
                String var5 = var10000.getName();
                var10000.setName((String)var3);
                return var5;
            }
            break;
        case 104079552:
            if (var10001.equals("money")) {
                BigDecimal var4 = var10000.getMoney();
                var10000.setMoney((BigDecimal)var3);
                return var4;
            }
            break;
        case 1069376125:
            if (var10001.equals("birthday")) {
                Date var10002 = var10000.getBirthday();
                var10000.setBirthday((Date)var3);
                return var10002;
            }
        }
        return null;
    }
    static {
        CGLIB$STATICHOOK1();
        keys = new FixedKeySet(new String[]{"birthday", "money", "name", "id", "age", "friends"});
    }
    static void CGLIB$STATICHOOK1() {
        CGLIB$load_class$java$2Eutil$2ESet = Class.forName("java.util.Set");
        CGLIB$load_class$java$2Elang$2EInteger = Class.forName("java.lang.Integer");
        CGLIB$load_class$java$2Elang$2EString = Class.forName("java.lang.String");
        CGLIB$load_class$java$2Emath$2EBigDecimal = Class.forName("java.math.BigDecimal");
        CGLIB$load_class$java$2Eutil$2EDate = Class.forName("java.util.Date");
    }
    public Set keySet() {
        return keys;
    }
    public Class getPropertyType(String var1) {
        switch(var1.hashCode()) {
        case -600094315:
            if (var1.equals("friends")) {
                return CGLIB$load_class$java$2Eutil$2ESet;
            }
            break;
        case 3355:
            if (var1.equals("id")) {
                return Integer.TYPE;
            }
            break;
        case 96511:
            if (var1.equals("age")) {
                return CGLIB$load_class$java$2Elang$2EInteger;
            }
            break;
        case 3373707:
            if (var1.equals("name")) {
                return CGLIB$load_class$java$2Elang$2EString;
            }
            break;
        case 104079552:
            if (var1.equals("money")) {
                return CGLIB$load_class$java$2Emath$2EBigDecimal;
            }
            break;
        case 1069376125:
            if (var1.equals("birthday")) {
                return CGLIB$load_class$java$2Eutil$2EDate;
            }
        }
        return null;
    }
}

這個生成的類繼承自BeanMap,在構造時傳進來bean實例,并且根據(jù)bean的屬性創(chuàng)建對應的get/put方法

可以看出來在執(zhí)行get和put時都是根據(jù)屬性名稱找到對應bean實例的set/get方法進行處理。也因此beanMap和對應實例會相互影響

還具備getPropertyType獲取字段類型的功能

在bean轉map過程中除了生成這個動態(tài)class之外(生成之后會緩存,對于同一類型的bean,不會重復創(chuàng)建),整個過程沒有真正復制對象變成map(避免的內存的浪費),也沒有通過效率較慢的反射去操作bean實例。因此BeanMap性能是比較不錯的

到此這篇關于Java BeanMap實現(xiàn)Bean與Map的相互轉換的文章就介紹到這了,更多相關Bean與Map的相互轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot整合Quartz及異步調用的案例

    SpringBoot整合Quartz及異步調用的案例

    Quartz是一個完全由java編寫的開源作業(yè)調度框架、它的簡單易用受到業(yè)內人士的一致好評,這篇文章主要介紹了SpringBoot整合Quartz及異步調用,需要的朋友可以參考下
    2023-03-03
  • Java的Spring框架中AOP項目的一般配置和部署教程

    Java的Spring框架中AOP項目的一般配置和部署教程

    這篇文章主要介紹了Java的Spring框架中AOP項目的一般配置和部署教程,AOP面向方面編程的項目部署結構都比較類似,因而也被看作是Spring的一種設計模式使用,需要的朋友可以參考下
    2016-04-04
  • Java生成二維碼可添加logo和文字功能

    Java生成二維碼可添加logo和文字功能

    這篇文章主要介紹了Java生成二維碼可添加logo和文字功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Java中double數(shù)值保留兩位小數(shù)的4種實現(xiàn)方式舉例

    Java中double數(shù)值保留兩位小數(shù)的4種實現(xiàn)方式舉例

    在Java編程中,我們經常遇到需要對double類型的浮點數(shù)進行精確截斷或四舍五入保留兩位小數(shù)的需求,這篇文章主要給大家介紹了關于Java中double數(shù)值保留兩位小數(shù)的4種實現(xiàn)方式,需要的朋友可以參考下
    2024-07-07
  • javaweb中mysql數(shù)據(jù)庫連接步驟方法及其實例

    javaweb中mysql數(shù)據(jù)庫連接步驟方法及其實例

    這篇文章主要介紹了使用java web 連接MySQL數(shù)據(jù)庫的驅動方法的相關知識,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2017-04-04
  • Java PriorityQueue數(shù)據(jù)結構接口原理及用法

    Java PriorityQueue數(shù)據(jù)結構接口原理及用法

    這篇文章主要介紹了Java PriorityQueue數(shù)據(jù)結構接口原理及用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 一文總結Java獲取文件后綴名的所有方法

    一文總結Java獲取文件后綴名的所有方法

    Java是一種應用廣泛的編程語言,可以通過多種方式來實現(xiàn)對文件的操作,如文件名后綴、文件擴展名等,下面這篇文章主要給大家介紹了關于Java獲取文件后綴名的所有方法,需要的朋友可以參考下
    2023-05-05
  • Spring線程池ThreadPoolTaskExecutor配置詳情

    Spring線程池ThreadPoolTaskExecutor配置詳情

    本篇文章主要介紹了Spring線程池ThreadPoolTaskExecutor配置詳情,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • springBoot中的properties配置解析

    springBoot中的properties配置解析

    這篇文章主要介紹了springBoot中的properties配置解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實現(xiàn)拓撲排序的示例代碼

    Java實現(xiàn)拓撲排序的示例代碼

    這篇文章我們要講的是拓撲排序,這是一個針對有向無環(huán)圖的算法,主要是為了解決前驅后繼的關系,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-05-05

最新評論