1. 程式人生 > 程式設計 >java中實現map與物件相互轉換的幾種實現

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,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,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>();
 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,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,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與物件相互轉換內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!