iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JavaBeanMap实现Bean与Map的相互转换
  • 636
分享到

JavaBeanMap实现Bean与Map的相互转换

BeanMapBean与Map的相互转换BeanMapBean与Map转换 2022-11-21 22:11:56 636人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录bean转Mapmap转BeanbeanMap实现以及高性能的原因net.sf.cglib.beans.BeanMap用法 bean转Map @Data public class

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实现以及高性能的原因

先看beanMap

public abstract class BeanMap implements Map 

继承自Map接口,实现了contains,remove,put,get等操作

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

但是remove会抛出UnsupportedOperationException

BeanMap.create()方法通过asm动态生成字节码创建一个beanMap

那么我们来看看创建出来的beanMap的字节码文件

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实例,并且根据bean的属性创建对应的get/put方法

可以看出来在执行get和put时都是根据属性名称找到对应bean实例的set/get方法进行处理。也因此beanMap和对应实例会相互影响

还具备getPropertyType获取字段类型的功能

在bean转map过程中除了生成这个动态class之外(生成之后会缓存,对于同一类型的bean,不会重复创建),整个过程没有真正复制对象变成map(避免的内存的浪费),也没有通过效率较慢的反射去操作bean实例。因此BeanMap性能是比较不错的

到此这篇关于Java BeanMap实现Bean与Map的相互转换的文章就介绍到这了,更多相关Bean与Map的相互转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaBeanMap实现Bean与Map的相互转换

本文链接: https://www.lsjlt.com/news/173290.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaBeanMap实现Bean与Map的相互转换
    目录bean转Mapmap转BeanbeanMap实现以及高性能的原因net.sf.cglib.beans.BeanMap用法 bean转Map @Data public class...
    99+
    2022-11-21
    BeanMap Bean与Map的相互转换 BeanMap Bean与Map转换
  • Java BeanMap如何实现Bean与Map的相互转换
    本篇内容主要讲解“Java BeanMap如何实现Bean与Map的相互转换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java BeanMap如何实现Bean与Map的相...
    99+
    2023-07-04
  • go语言map与string的相互转换的实现
    一.map转string import ( "encoding/json" ) func MapToJson(param map[string]interface{}) ...
    99+
    2022-06-07
    map GO string
  • go语言中的json与map相互转换实现
    主要是引入 "encoding/json" 包;用到的也就是其中的两个函数json.Marshal和json.Unmarshal。 1、json.Marshal ...
    99+
    2022-11-11
  • Map与JavaBean相互转换的工具类
    下面就来分享工具类的内容: 使用范围:JavaBean类对象的属性不能是数组、List、Set、Map public class MapBeanUtil {         pu...
    99+
    2022-11-13
  • 使用Jackson实现Map与Bean互转方式
    Jackson Map与Bean互转 在使用 java 开发中,通常需要把 Map 转成 Bean,或把 Bean 转成 Map,这就用的工具类,在此推荐使用import com.f...
    99+
    2022-11-12
  • Java中BeanMap怎么实现对象与Map相互转换
    这篇文章主要介绍“Java中BeanMap怎么实现对象与Map相互转换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中BeanMap怎么实现对象与Map相互转换”文章能帮助大家解决问题。ja...
    99+
    2023-06-29
  • java中map与实体类的相互转换操作
    java中map与实体类的相互转换 1. 在 pom.xml 中引入依赖包 <dependency> <groupId>com.alibaba&l...
    99+
    2022-11-12
  • Java中Map与对象之间互相转换
    文章目录 Map转Object方式一:通过BeanMap转方式二:通过fastJson转方式三:通过gson转 Object转Map方式一:通过BeanMap转方式二:通过fastJso...
    99+
    2023-10-03
    java
  • Map与JavaBean相互转换的工具类怎么使用
    今天小编给大家分享一下Map与JavaBean相互转换的工具类怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用范围...
    99+
    2023-06-29
  • golang struct, map, json之间的相互转换
    目录公共代码区域 一、map, struct 互转 1.map 转 struct2、struct 转 map 二、struct, json 互转 三、map, json 互转 1.m...
    99+
    2022-11-12
  • Canvas与Image怎么实现互相转换
    这篇文章将为大家详细讲解有关Canvas与Image怎么实现互相转换,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。转换 Image为 Canvas 要把图片...
    99+
    2022-10-19
  • ESM与CJS互相转换怎么实现
    本篇内容介绍了“ESM与CJS互相转换怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文ESM 和 CJS 是我们常用的模块格式,两...
    99+
    2023-07-05
  • Java-json相关转换,JSONObject与实体类/map互转、List/List<map>和JSONArray互转、获取JSONObject中的key value、字符串String转换等
    博客背景是Java开发。json相关的转换、取值等在日常开发中经常使用,但有时候还是会忘记or遇到些奇奇怪怪的问题。以此记录,提醒自己~不定期更新~ 文章目录 1、JSONObject相关实体类和JSONObject互转Map和JS...
    99+
    2023-08-17
    java json list
  • tensor与numpy的相互转换
    tensor与numpy的相互转换 1. numpy转tensor命令1:torch.tensor()命令2:torch.as_tensor()命令3:torch.from_numpy()区别...
    99+
    2023-09-05
    pytorch
  • python 实现docx与doc文件的互相转换
    因文件格式要求,需要将docx 与doc文件相互转换,特寻找python代码,与大家共分享 from win32com import client #转换doc为docx def...
    99+
    2022-11-11
  • C#实现子类与父类的相互转换
    目录子类与父类的相互转换例一例二子类父类之间相互转换的问题父类:动物类(Animal)子类:狗类(Dog)子类与父类的相互转换 1.父类不能直接强制转换成子类 2.子类可以强制转换成...
    99+
    2022-11-13
  • Java中Json与List、Map、entity的互相转化
    目录第一步:导入依赖第二步:开始使用场景一:转换普通对象(Bean)。使用场景二:转换List集合。Json转List对象使用场景三:转换Map集合。在开发中,Json转换的场景往往...
    99+
    2022-11-13
  • 如何用ADO.NET实现txt与Excel的互相转换
    本篇文章为大家展示了如何用ADO.NET实现txt与Excel的互相转换,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在园子里看过很多文章,关于设计模式,关于架构等等,我在这里谈谈一些软件的功能,为...
    99+
    2023-06-17
  • android中怎么实现String与InputStream相互转换
    android中怎么实现String与InputStream相互转换,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一:纯手戳代码:String to InputStreamSt...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作