java中实现map与对象相互转换的几种实现
最近,研究map与java对象之间的相互转换,总结了5种方法:
第一种:使用org.apache.commons.beanutils转换
用到的主要jar包:commons-beanutils-1.9.3.jar
//map转java对象 publicstaticObjectmapToObject(Mapmap,Class>beanClass) throwsException{ if(map==null){ returnnull; } Objectobj=beanClass.newInstance(); BeanUtils.populate(obj,map); returnobj; } //java对象转map publicstaticMap,?>objectToMap(Objectobj){ if(obj==null) returnnull; returnnewBeanMap(obj); }
在使用该方法进行java对象转map时,可能会发生以下错误:
Exceptioninthread"main"java.lang.NoClassDefFoundError:org/apache/commons/collections/Transformer
atjava.lang.ClassLoader.defineClass1(NativeMethod)
atjava.lang.ClassLoader.defineClass(ClassLoader.java:621)
atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
atjava.net.URLClassLoader.defineClass(URLClassLoader.java:260)
atjava.net.URLClassLoader.access$000(URLClassLoader.java:56)
atjava.net.URLClassLoader$1.run(URLClassLoader.java:195)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
atorg.apache.commons.beanutils.BeanMap.createTypeTransformers(BeanMap.java:132)
atorg.apache.commons.beanutils.BeanMap.(BeanMap.java:68)
atcom.example2.pojo.PojoToMap.objectToMap(PojoToMap.java:23)
atcom.example2.pojo.PojoToMap.main(PojoToMap.java:16)
Causedby:java.lang.ClassNotFoundException:org.apache.commons.collections.Transformer
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
...16more
解决方法见本人的另一篇文章:https://www.nhooo.com/article/190471.htm
第二种:使用Introspector转换
//map转java对象 publicstaticObjectmapToObject(Mapmap,Class>beanClass)throwsException{ if(map==null) returnnull; Objectobj=beanClass.newInstance(); BeanInfobeanInfo=Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[]propertyDescriptors=beanInfo.getPropertyDescriptors(); for(PropertyDescriptorproperty:propertyDescriptors){ Methodsetter=property.getWriteMethod(); if(setter!=null){ setter.invoke(obj,map.get(property.getName())); } } returnobj; } //java对象转map publicstaticMap objectToMap(Objectobj)throwsException{ if(obj==null){ returnnull; } Map map=newHashMap (); BeanInfobeanInfo=Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[]propertyDescriptors=beanInfo .getPropertyDescriptors(); for(PropertyDescriptorproperty:propertyDescriptors){ Stringkey=property.getName(); if(key.compareToIgnoreCase("class")==0){ continue; } Methodgetter=property.getReadMethod(); Objectvalue=getter!=null?getter.invoke(obj):null; map.put(key,value); } returnmap; }
第三种:使用reflect转换
//map转java对象 publicstaticObjectmapToObject(Mapmap,Class>beanClass)throwsException{ if(map==null){ returnnull; } Objectobject=beanClass.newInstance(); Field[]fields=beanClass.getDeclaredFields(); for(Fieldfield:fields){ intmod=field.getModifiers(); if(Modifier.isFinal(mod)||Modifier.isStatic(mod)){ continue; } field.setAccessible(true); field.set(object,map.get(field.getName())); } returnobject; } //java对象转map publicstaticMap objectToMap(Objectobj)throwsException{ if(obj==null){ returnnull; } Map map=newHashMap (); Field[]declaredFields=obj.getClass().getDeclaredFields(); for(Fieldfield:declaredFields){ field.setAccessible(true); map.put(field.getName(),field.get(obj)); } returnmap; }
第四种:使用net.sf.cglib.beans.BeanMap转换
用到的主要jar包:cglib-2.2.2.jar
//map转java对象 publicstaticObjectmapToObject(Mapmap,Class>beanClass)throwsException{ Objectobject=beanClass.newInstance(); BeanMapbeanMap=BeanMap.create(object); beanMap.putAll(map); returnobject; } //java对象转map publicstaticMap objectToMap(Objectobj){ Map map=Maps.newHashMap(); if(obj!=null){ BeanMapbeanMap=BeanMap.create(obj); for(Objectkey:beanMap.keySet()){ map.put(key+"",beanMap.get(key)); } } returnmap; }
在使用本方法进行map转java对象时,可能会发生以下错误:
Exceptioninthread"main"java.lang.NoClassDefFoundError:org/objectweb/asm/Type
atnet.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184)
atnet.sf.cglib.core.KeyFactory.(KeyFactory.java:66)
atnet.sf.cglib.beans.BeanMap$Generator.(BeanMap.java:64)
atnet.sf.cglib.beans.BeanMap.create(BeanMap.java:56)
atcom.example2.pojo.MapToPojo.mapToBean(MapToPojo.java:27)
atcom.example2.pojo.MapToPojo.main(MapToPojo.java:18)
Causedby:java.lang.ClassNotFoundException:org.objectweb.asm.Type
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
...6more
解决方法见本人的另一篇文章:https://www.nhooo.com/article/190474.htm
第五种:使用json转换
用到的主要jar包:fastjson-1.2.54.jar
//map转java对象 publicstaticObjectmapToObject(Mapmap,Class>beanClass)throwsException{ StringjsonStr=JSONObject.toJSONString(map); returnJSONObject.parseObject(jsonStr,beanClass); } //java对象转map publicstaticMap objectToMap(Objectobj){ StringjsonStr=JSONObject.toJSONString(obj); returnJSONObject.parseObject(jsonStr); }
以上方法本人均实际测试通过。到此这篇关于java中实现map与对象相互转换的几种实现的文章就介绍到这了,更多相关javamap与对象相互转换内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。