Java实体对象和Map对象之间的转换

  • A+
所属分类:java

在工作中,我们经常会遇到这样的情况:需要将对象的个别属性和对应的值存放到Map对象中。其实属性相对少的时候还是比较方便的,我们完完全全手动写入下就能解决;但要如果要放入的属性特别的多,需要写的地方也特别多的时候,再这么手动一个一个写的话,这个工作量还是不小的。

所以与其手动写入,倒不如直接统一用现成的工具处理下。爱编程小编带大家下面来看看实现代码:

  1. /**
  2.      * 实体对象转成Map
  3.      * @param obj 实体对象
  4.      * @return
  5.      */
  6.     public static Map<String, Object> object2Map(Object obj) {
  7.         Map<String, Object> map = new HashMap<>();
  8.         if (obj == null) {
  9.             return map;
  10.         }
  11.         Class clazz = obj.getClass();
  12.         Field[] fields = clazz.getDeclaredFields();
  13.         try {
  14.             for (Field field : fields) {
  15.                 field.setAccessible(true);
  16.                 map.put(field.getName(), field.get(obj));
  17.             }
  18.         } catch (Exception e) {
  19.             e.printStackTrace();
  20.         }
  21.         return map;
  22.     }

我这里主要是用的反射的写法,至于其他的方法暂时还没有想到。这里我将所有实体类的属性及其对应的值放入了map当中,而且HashMap也是允许null键和值存在的,所以就不用考虑null这种情况。
实体对象可以转成Map,那么Map必然也可转成实体对象,具体的代码如下:

  1. /**
  2.      * Map转成实体对象
  3.      * @param map map实体对象包含属性
  4.      * @param clazz 实体对象类型
  5.      * @return
  6.      */
  7.     public static Object map2Object(Map<String, Object> map, Class<?> clazz) {
  8.         if (map == null) {
  9.             return null;
  10.         }
  11.         Object obj = null;
  12.         try {
  13.             obj = clazz.newInstance();
  14.             Field[] fields = obj.getClass().getDeclaredFields();
  15.             for (Field field : fields) {
  16.                 int mod = field.getModifiers();
  17.                 if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
  18.                     continue;
  19.                 }
  20.                 field.setAccessible(true);
  21.                 field.set(obj, map.get(field.getName()));
  22.             }
  23.         } catch (Exception e) {
  24.             e.printStackTrace();
  25.         }
  26.         return obj;
  27.     }

下面我就来测试下,看下具体的效果:
1.先写一个实体类Student

  1. class Student {
  2.     private String userName;
  3.     private String age;
  4.     public String getUserName() {
  5.         return userName;
  6.     }
  7.     public void setUserName(String userName) {
  8.         this.userName = userName;
  9.     }
  10.     public String getAge() {
  11.         return age;
  12.     }
  13.     public void setAge(String age) {
  14.         this.age = age;
  15.     }
  16.     @Override
  17.     public String toString() {
  18.         return "Student [userName=" + userName + ", age=" + age + "]";
  19.     }
  20. }

2.在写个主方法测试下结果

  1. public static void main(String[] args) {
  2.         Student s = new Student();
  3.         s.setUserName("ZHH");
  4.         s.setAge("24");
  5.         System.out.println(object2Map(s));
  6.         Map<String, Object> map = new HashMap<>();
  7.         map.put("userName""zhh");
  8.         map.put("age""24");
  9.         System.out.println(map2Object(map, Student.class));
  10.     }

运行结果如下:

  1. {userName=ZHHage=24}
  2. Student [userName=zhhage=24]

如上,证明该方法可行。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: