一、map转实体类库
Java中提供了许多map转实体类的库,如Apache BeanUtils、Spring的BeanWrapper等等。其中Apache BeanUtils是开发者使用最多的一个库,可以轻松的完成从map到实体类的转换,并且对类型转换的支持也很完善。
public static void populate(Object bean, Mapproperties) throws IllegalAccessException, InvocationTargetException { if ((bean == null) || (properties == null)) { return; } if (bean instanceof DynaBean) { DynaProperty[] descriptors = ((DynaBean)bean).getDynaClass().getDynaProperties(); for (int i = 0; i < descriptors.length; i++) { String name = descriptors[i].getName(); if (properties.containsKey(name)) { ((DynaBean)bean).set(name, properties.get(name)); } } } else { PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(bean); for (int i = 0; i < descriptors.length; i++) { String name = descriptors[i].getName(); if (("class".equals(name)) || (!properties.containsKey(name))) { continue; } Method writeMethod = PropertyUtils.getWriteMethod(descriptors[i]); if (writeMethod != null) { Object value = properties.get(name); if (value == null) { Type[] types = writeMethod.getGenericParameterTypes(); if ((types.length > 0) && ((types[0] instanceof Class)) && (!(types[0] instanceof Enum))) { Class parameterType = (Class)types[0]; if (parameterType.isPrimitive()) { continue; } } } try { BeanUtils.setProperty(bean, name, value); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } } }
二、map转实体类 mybatisplus
Mybatis-plus是Mybatis的增强工具,其中包含了对map转实体类的支持,可以很方便地将map转换为需要的实体类,具体代码如下:
Mapmap = new HashMap (); map.put("id", 1); map.put("name", "Tom"); User user = MapUtil.toBean(map, new User());
三、map转实体类对象
在Java中,可以通过反射实现将map转换为实体类对象,比较常见的做法是使用BeanUtils,调用其populate方法进行转换,具体代码如下:
Mapmap = new HashMap (); map.put("id", 1); map.put("name", "Tom"); User user = new User(); BeanUtils.populate(user, map);
四、map转实体类空指针
在进行map转换时,有的时候可能会遇到空指针异常,这是因为map中不存在需要转换的属性,可以通过以下方式解决:
// 判断属性是否存在 if(map.containsKey("name")){ user.setName(map.get("name")); }
五、map转实体类工具类
为了方便使用,可以编写一个工具类,封装map转实体类的过程,具体代码如下:
public class MapUtil { public staticT toBean(Map map, Class clazz) { try { T obj = clazz.newInstance(); BeanUtils.populate(obj, map); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } }
六、map转实体类全是string
在进行map转换时,有的时候map中的属性都是字符串类型,但实体类中的属性类型却不是,可以通过以下方式解决:
Mapmap = new HashMap (); map.put("id", "1"); map.put("name", "Tom"); User user = new User(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); try { Field field = User.class.getDeclaredField(key); field.setAccessible(true);//设置为可访问 Class type = field.getType(); if (type == String.class) { field.set(user, value); } else if (type == Integer.class) { field.set(user, Integer.parseInt(value)); } else if (type == BigDecimal.class) { field.set(user, new BigDecimal(value)); } //... } catch (Exception e) { e.printStackTrace(); } }
七、实体类转map
实体类转map,可以通过反射获取实体类的所有属性,然后将属性名称作为key,属性值作为value存入map中,具体代码如下:
public static MapobjectToMap(Object obj) { if (obj == null) return null; Map map = new LinkedHashMap (); Class clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { try { field.setAccessible(true); map.put(field.getName(), field.get(obj)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return map; }
八、map转换成实体类
如果需要将一个map中的多个值转换成同一个实体类对象,可以使用BeanUtils.populate方法,具体代码如下:
Mapmap = new HashMap (); map.put("id", 1); map.put("name", "Tom"); map.put("age", 18); User user1 = new User(); User user2 = new User(); BeanUtils.populate(user1, map); BeanUtils.populate(user2, map);
九、map转成实体类对象
有时候需要将一个map转换成某个实体类对象的属性,可以通过反射设置属性值的方式实现。具体代码如下:
Mapmap = new HashMap (); map.put("id", 1); map.put("name", "Tom"); User user = new User(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); try { Field field = User.class.getDeclaredField(key); field.setAccessible(true); //设置为可访问 Class type = field.getType(); if (type == String.class) { field.set(user, value.toString()); } else if (type == Integer.class) { field.set(user, Integer.parseInt(value.toString())); } else if (type == BigDecimal.class) { field.set(user, new BigDecimal(value.toString())); } //... } catch (Exception e) { e.printStackTrace(); } }
十、总结
通过本文的介绍,我们了解了Java中如何将map转换为实体类对象。其中,Apache BeanUtils和Spring的BeanWrapper提供了更加便捷的map转实体类的方法,而Mybatis-plus则是在Mybatis基础上提供了更多功能的增强工具。同时,我们还介绍了如何处理map中属性为字符串类型的情况,以及如何将实体类对象转换成map,以及map之间的转换。希望本文对读者有所帮助。