ReflectUtil.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package com.yihu.jw.util;
  2. import com.alibaba.fastjson.JSON;
  3. import java.lang.annotation.Annotation;
  4. import java.lang.reflect.Field;
  5. import java.util.LinkedHashMap;
  6. import java.util.Map;
  7. import javax.persistence.Column;
  8. /**
  9. * Created by Trick on 2018/4/25.
  10. */
  11. public class ReflectUtil {
  12. /**
  13. * 将jdbcTemplate查询的map结果集 反射生成对应的bean
  14. * @param clazz 意向反射的实体.clazz
  15. * @param jdbcMapResult 查询结果集 key is UpperCase
  16. * @return
  17. * @see
  18. */
  19. public static <T> T reflect(Class<T> clazz, Map<String, Object> jdbcMapResult)
  20. {
  21. //获得
  22. Field[] fields = clazz.getDeclaredFields();
  23. //存放field和column对应关系,该关系来自于实体类的 @Column配置
  24. Map<String/*field name in modelBean*/, String/*column in db*/> fieldHasColumnAnnoMap = new LinkedHashMap<String, String>();
  25. Annotation[] annotations = null;
  26. for (Field field : fields)
  27. {
  28. annotations = field.getAnnotations();
  29. for (Annotation an : annotations)
  30. {
  31. if (an instanceof Column)
  32. {
  33. Column column = (Column)an;
  34. fieldHasColumnAnnoMap.put(field.getName(), column.name());
  35. }
  36. }
  37. }
  38. //存放field name 和 对应的来自map的该field的属性值,用于后续reflect成ModelBean
  39. Map<String, Object> conCurrent = new LinkedHashMap<String, Object>();
  40. for (Map.Entry<String, String> en : fieldHasColumnAnnoMap.entrySet())
  41. {
  42. //将column大写。因为jdbcMapResult key is UpperCase
  43. String key = en.getValue().toUpperCase();
  44. //获得map的该field的属性值
  45. Object value = jdbcMapResult.get(key);
  46. //确保value有效性,防止JSON reflect时异常
  47. if (value != null)
  48. {
  49. conCurrent.put(en.getKey(), jdbcMapResult.get(key));
  50. }
  51. }
  52. //fastjson reflect to modelbean
  53. return JSON.parseObject(JSON.toJSONString(conCurrent), clazz);
  54. }
  55. }