map与java对象相互转换

map与java对象相互转换最近,研究map与java对象之间的相互转换,总结了5种方法:第一种:使用org.apache.commons.beanutils转换用到的主要jar包:commons-beanutils-1.9.3.jar//map转java对象publicstaticObjectmapToObject(Map<String,Object>map,Class<?&g…

大家好,又见面了,我是你们的朋友全栈君。

最近,研究map与java对象之间的相互转换,总结了5种方法:

第一种:使用org.apache.commons.beanutils转换

用到的主要jar包:commons-beanutils-1.9.3.jar

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass)
			throws Exception {
		if (map == null) {
			return null;
		}
		Object obj = beanClass.newInstance();
		BeanUtils.populate(obj, map);
		return obj;
	}

//java对象转map
public static Map<?, ?> objectToMap(Object obj) {
		if (obj == null)
			return null;
		return new BeanMap(obj);
	}

在使用该方法进行java对象转map时,可能会发生以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/Transformer
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	at org.apache.commons.beanutils.BeanMap.createTypeTransformers(BeanMap.java:132)
	at org.apache.commons.beanutils.BeanMap.<clinit>(BeanMap.java:68)
	at com.example2.pojo.PojoToMap.objectToMap(PojoToMap.java:23)
	at com.example2.pojo.PojoToMap.main(PojoToMap.java:16)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	... 16 more

解决方法见本人的另一篇文章: https://blog.csdn.net/liuyunyihao/article/details/86596595

第二种:使用Introspector转换

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
        if (map == null)
            return null;
        Object obj = beanClass.newInstance();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            Method setter = property.getWriteMethod();
            if (setter != null) {
                setter.invoke(obj, map.get(property.getName()));
            }
        }
        return obj;
    }

//java对象转map
public static Map<String, Object> objectToMap(Object obj) throws Exception {
	if (obj == null) {
		return null;
	}
	Map<String, Object> map = new HashMap<String, Object>();
	BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	PropertyDescriptor[] propertyDescriptors = beanInfo
				.getPropertyDescriptors();
	for (PropertyDescriptor property : propertyDescriptors) {
		String key = property.getName();
		if (key.compareToIgnoreCase("class") == 0) {
			continue;
		}
		Method getter = property.getReadMethod();
		Object value = getter != null ? getter.invoke(obj) : null;
		map.put(key, value);
	}
	return map;
}

第三种:使用reflect转换

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
        if (map == null) {
            return null;
        }
        Object object = beanClass.newInstance();
        Field[] fields = beanClass.getDeclaredFields();
        for (Field field : fields) {
            int mod = field.getModifiers();
            if (Modifier.isFinal(mod) || Modifier.isStatic(mod)) {
                continue;
            }
            field.setAccessible(true);
            field.set(object, map.get(field.getName()));
        }
        return object;
    }

//java对象转map
public static Map<String, Object> objectToMap(Object obj) throws Exception {
	if (obj == null) {
		return null;
	}
	Map<String, Object> map = new HashMap<String, Object>();
	Field[] declaredFields = obj.getClass().getDeclaredFields();
	for (Field field : declaredFields) {
		field.setAccessible(true);
		map.put(field.getName(), field.get(obj));
	}
	return map;
}

第四种:使用net.sf.cglib.beans.BeanMap转换

用到的主要jar包:cglib-2.2.2.jar

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
    Object object = beanClass.newInstance();
    BeanMap beanMap = BeanMap.create(object);
    beanMap.putAll(map);
    return object;
}

//java对象转map
public static Map<String, Object> objectToMap(Object obj) {
    Map<String, Object> map = Maps.newHashMap();
    if (obj != null) {
        BeanMap beanMap = BeanMap.create(obj);
        for (Object key : beanMap.keySet()) {
            map.put(key + "", beanMap.get(key));
        }
    }
    return map;
}

在使用本方法进行map转java对象时,可能会发生以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type
	at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184)
	at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
	at net.sf.cglib.beans.BeanMap$Generator.<clinit>(BeanMap.java:64)
	at net.sf.cglib.beans.BeanMap.create(BeanMap.java:56)
	at com.example2.pojo.MapToPojo.mapToBean(MapToPojo.java:27)
	at com.example2.pojo.MapToPojo.main(MapToPojo.java:18)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	... 6 more

解决方法见本人的另一篇文章:https://blog.csdn.net/liuyunyihao/article/details/86593722

第五种:使用json转换

用到的主要jar包:fastjson-1.2.54.jar

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
    String jsonStr = JSONObject.toJSONString(map);
    return JSONObject.parseObject(jsonStr, beanClass);
}

//java对象转map
public static Map<String, Object> objectToMap(Object obj) {
    String jsonStr = JSONObject.toJSONString(obj);
    return JSONObject.parseObject(jsonStr);
}

以上方法本人均实际测试通过。

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132273.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python贪吃蛇 (完整代码+详细注释+粘贴即食)

    Python贪吃蛇 (完整代码+详细注释+粘贴即食)代码#!/usr/bin/envpython#-*-coding:utf-8-*-#author:Wangdalitime:2021年1月24日16:08:44#python实现:贪吃蛇”’游戏玩法:回车开始游戏;空格暂停游戏/继续游戏;方向键/wsad控制小蛇走向”””思路:用列表存储蛇的身体;用浅色表示身体,深色背景将身体凸显出来;蛇的移动:仔细观察,是:身体除头和尾不动、尾部消失,头部增加,所以,新添加的元素放在列表头部、删除尾部元素;游戏结束判定策略:超出

    2022年5月15日
    36
  • java iso8601 PT1M,iso8601

    java iso8601 PT1M,iso8601普通时间转ISO8601格式的时间publicstaticStringgetISO8601TimestampFromDateStr(Stringtimestamp){java.time.format.DateTimeFormatterdtf1=java.time.format.DateTimeFormatter.ofPattern(“yyyy-MM-ddHH:mm:ss”);Loc…

    2022年10月23日
    0
  • linux经典教程_三阶魔方初级入门教程详细图解

    linux经典教程_三阶魔方初级入门教程详细图解一、Linux常用命令1.文件处理命令1.1目录处理命令1.2文件处理命令1.3链接命令2.权限管理命令2.1权限管理命令chmod2.2其他权限管理命令3.文件搜索命令3.1文件搜索命令find3.2其他文件搜索命令4.帮助命令4.1帮助命令5.用户管理命令5.1用户管理命令6.压缩解压命令6.1压缩解压命令7.网络命令7.1网络命令8.关机重启命令8.1关机重启命令二、文本编辑器-Vim…

    2022年10月13日
    0
  • JAVA API文档中文版,网盘下载[通俗易懂]

    JAVA API文档中文版,网盘下载[通俗易懂]JAVAAPI文档中文版,网盘下载链接:https://pan.baidu.com/s/1LSNeuGF6YTQeULqWjG0n4g提取码:6poh

    2022年7月13日
    10
  • 敏捷大数据流程

    敏捷大数据流程

    2021年8月31日
    52
  • 少儿编程150讲轻松学Scratch(二)-制作过马路小游戏

    少儿编程150讲轻松学Scratch(二)-制作过马路小游戏前言今天为大家带来一款小游戏的制作教程,只要跟着步骤做,就能轻松地制作出属于自己的过马路小游戏。家长们可以用此教程指导孩子逐步完成,然后一起测试和游玩,再一起探究每处代码的逻辑意义。教程教程如下:打开Scratch程序后,默认就会有一只小猫角色,我们就使用它当我们游戏的主角,然后再添加一个汽车角色。而后编辑汽车的造型,点击右键菜单的复制命令,复制一个新的造型。在新造型右上角,点击左右翻转按钮,使车子翻转到车头向左。再分别修改两个造型的名称为A和B。然后新建角色私有的变量

    2022年6月19日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号