Java中 实体类与Map互转

朱雀 2024-03-26 08:05 113阅读 0赞

1、map转对象;
主要思路,将map中的key-value取出来,然后和给定的对象去匹配

  1. /**
  2. * 利用反射将map集合封装成bean对象
  3. *
  4. * @param params
  5. * @param clazz
  6. * @return
  7. */
  8. public static <T> T mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {
  9. Object obj = clazz.newInstance();
  10. if (map != null && !map.isEmpty() && map.size() > 0) {
  11. for (Map.Entry<String, Object> entry : map.entrySet()) {
  12. String propertyName = entry.getKey(); // 属性名
  13. Object value = entry.getValue(); // 属性值
  14. String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
  15. Field field = getClassField(clazz, propertyName); //获取和map的key匹配的属性名称
  16. if (field == null){
  17. continue;
  18. }
  19. Class<?> fieldTypeClass = field.getType();
  20. value = convertValType(value, fieldTypeClass);
  21. try {
  22. clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);
  23. } catch (NoSuchMethodException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. return (T) obj;
  29. }
  30. /**
  31. * 根据给定对象类匹配对象中的特定字段
  32. * @param clazz
  33. * @param fieldName
  34. * @return
  35. */
  36. private static Field getClassField(Class<?> clazz, String fieldName) {
  37. if (Object.class.getName().equals(clazz.getName())) {
  38. return null;
  39. }
  40. Field[] declaredFields = clazz.getDeclaredFields();
  41. for (Field field : declaredFields) {
  42. if (field.getName().equals(fieldName)) {
  43. return field;
  44. }
  45. }
  46. Class<?> superClass = clazz.getSuperclass(); //如果该类还有父类,将父类对象中的字段也取出
  47. if (superClass != null) { //递归获取
  48. return getClassField(superClass, fieldName);
  49. }
  50. return null;
  51. }
  52. /**
  53. * 将map的value值转为实体类中字段类型匹配的方法
  54. * @param value
  55. * @param fieldTypeClass
  56. * @return
  57. */
  58. private static Object convertValType(Object value, Class<?> fieldTypeClass) {
  59. Object retVal = null;
  60. if (Long.class.getName().equals(fieldTypeClass.getName())
  61. || long.class.getName().equals(fieldTypeClass.getName())) {
  62. retVal = Long.parseLong(value.toString());
  63. } else if (Integer.class.getName().equals(fieldTypeClass.getName())
  64. || int.class.getName().equals(fieldTypeClass.getName())) {
  65. retVal = Integer.parseInt(value.toString());
  66. } else if (Float.class.getName().equals(fieldTypeClass.getName())
  67. || float.class.getName().equals(fieldTypeClass.getName())) {
  68. retVal = Float.parseFloat(value.toString());
  69. } else if (Double.class.getName().equals(fieldTypeClass.getName())
  70. || double.class.getName().equals(fieldTypeClass.getName())) {
  71. retVal = Double.parseDouble(value.toString());
  72. } else {
  73. retVal = value;
  74. }
  75. return retVal;
  76. }

2、对象转map,
思路,同上述的分析类似,这不过这里需要反过来,给定一个待转化的实体类,通过反射,将实体类中的字段名称和字段值获取到,然后一一设置到map的key-value中,下面看代码,

  1. /**
  2. * 对象转map
  3. * @param obj
  4. * @return
  5. */
  6. private static Map<String, Object> objToMap(Object obj) {
  7. Map<String, Object> map = new HashMap<String, Object>();
  8. Field[] fields = obj.getClass().getDeclaredFields(); // 获取f对象对应类中的所有属性域
  9. for (int i = 0, len = fields.length; i < len; i++) {
  10. String varName = fields[i].getName();
  11. varName = varName.toLowerCase(); // 将key置为小写,默认为对象的属性
  12. try {
  13. boolean accessFlag = fields[i].isAccessible(); // 获取原来的访问控制权限
  14. fields[i].setAccessible(true); // 修改访问控制权限
  15. Object o = fields[i].get(obj); // 获取在对象f中属性fields[i]对应的对象中的变量
  16. if (o != null){
  17. map.put(varName, o.toString());
  18. }
  19. fields[i].setAccessible(accessFlag); // 恢复访问控制权限
  20. } catch (IllegalArgumentException ex) {
  21. ex.printStackTrace();
  22. } catch (IllegalAccessException ex) {
  23. ex.printStackTrace();
  24. }
  25. }
  26. return map;
  27. }

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读