java中实现map与对象相互转换的几种实现

 更新时间:2020年07月10日 11:11:48   作者:流云一号  
这篇文章主要介绍了java中实现map与对象相互转换的几种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近,研究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://www.jb51.net/article/190471.htm

第二种:使用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://www.jb51.net/article/190474.htm

第五种:使用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);
}

以上方法本人均实际测试通过。到此这篇关于java中实现map与对象相互转换的几种实现的文章就介绍到这了,更多相关java map与对象相互转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis参数处理的几种方法小结

    Mybatis参数处理的几种方法小结

    在Mybatis中如何处理参数是一个非常重要的环节,本文将详细介绍 Mybatis 的参数处理机制,包括传入参数和返回参数的处理方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Java NIO Buffer实现原理详解

    Java NIO Buffer实现原理详解

    本篇文章主要对NIO核心三件套:缓冲区(Buffer)、选择器 (Selector)和通道(Channel),其中之一的缓冲区Buffer实现原理的学习总结。感兴趣的小伙伴可以了解一下
    2021-11-11
  • java普通项目读取不到resources目录下资源文件的解决办法

    java普通项目读取不到resources目录下资源文件的解决办法

    这篇文章主要给大家介绍了关于java普通项目读取不到resources目录下资源文件的解决办法,Web项目中应该经常有这样的需求,在maven项目的resources目录下放一些文件,比如一些配置文件,资源文件等,需要的朋友可以参考下
    2023-09-09
  • JAVA正则表达式校验qq号码的方法

    JAVA正则表达式校验qq号码的方法

    Java作为一种开发语言,有许多值得推荐的地方,但是它一直以来没有自带对正则表达式的支持。下面小编给大家带来了JAVA正则表达式校验qq号码的方法,需要的朋友参考下吧
    2018-04-04
  • Java的jstack命令使用示例详解

    Java的jstack命令使用示例详解

    jstack 命令非常的简单,我们可以通过 jstack -h 或者 jstack -help 命令查看它的用法详情,今天通过本文重点给大家介绍Java的jstack命令使用,感兴趣的朋友一起看看吧
    2022-03-03
  • Java class文件格式之数据类型_动力节点Java学院整理

    Java class文件格式之数据类型_动力节点Java学院整理

    这篇文章主要介绍了Java class文件格式之数据类型的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java的深拷贝与浅拷贝的几种实现方式

    Java的深拷贝与浅拷贝的几种实现方式

    这篇文章主要介绍了Java的深拷贝与浅拷贝的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • idea启动spring项目中文乱码的解决方法

    idea启动spring项目中文乱码的解决方法

    本文主要介绍了idea启动spring项目中文乱码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 使用springboot时,解决@Scheduled定时器遇到的问题

    使用springboot时,解决@Scheduled定时器遇到的问题

    这篇文章主要介绍了使用springboot时,解决@Scheduled定时器遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解JAVA中priorityqueue的具体使用

    详解JAVA中priorityqueue的具体使用

    这篇文章主要介绍了详解JAVA中priorityqueue的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论