ReflectHelper.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package org.jeecg.common.util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. import java.util.*;
  6. import java.util.Map.Entry;
  7. import java.util.regex.Pattern;
  8. /**
  9. * @author 张代浩
  10. * @desc 通过反射来动态调用get 和 set 方法
  11. */
  12. @Slf4j
  13. public class ReflectHelper {
  14. private Class cls;
  15. /**
  16. * 传过来的对象
  17. */
  18. private Object obj;
  19. /**
  20. * 存放get方法
  21. */
  22. private Hashtable<String, Method> getMethods = null;
  23. /**
  24. * 存放set方法
  25. */
  26. private Hashtable<String, Method> setMethods = null;
  27. /**
  28. * 定义构造方法 -- 一般来说是个pojo
  29. *
  30. * @param o 目标对象
  31. */
  32. public ReflectHelper(Object o) {
  33. obj = o;
  34. initMethods();
  35. }
  36. /**
  37. * @desc 初始化
  38. */
  39. public void initMethods() {
  40. getMethods = new Hashtable<String, Method>();
  41. setMethods = new Hashtable<String, Method>();
  42. cls = obj.getClass();
  43. Method[] methods = cls.getMethods();
  44. // 定义正则表达式,从方法中过滤出getter / setter 函数.
  45. String gs = "get(\\w+)";
  46. Pattern getM = Pattern.compile(gs);
  47. String ss = "set(\\w+)";
  48. Pattern setM = Pattern.compile(ss);
  49. // 把方法中的"set" 或者 "get" 去掉
  50. String rapl = "$1";
  51. String param;
  52. for (int i = 0; i < methods.length; ++i) {
  53. Method m = methods[i];
  54. String methodName = m.getName();
  55. if (Pattern.matches(gs, methodName)) {
  56. param = getM.matcher(methodName).replaceAll(rapl).toLowerCase();
  57. getMethods.put(param, m);
  58. } else if (Pattern.matches(ss, methodName)) {
  59. param = setM.matcher(methodName).replaceAll(rapl).toLowerCase();
  60. setMethods.put(param, m);
  61. } else {
  62. // logger.info(methodName + " 不是getter,setter方法!");
  63. }
  64. }
  65. }
  66. /**
  67. * @desc 调用set方法
  68. */
  69. public boolean setMethodValue(String property, Object object) {
  70. Method m = setMethods.get(property.toLowerCase());
  71. if (m != null) {
  72. try {
  73. // 调用目标类的setter函数
  74. m.invoke(obj, object);
  75. return true;
  76. } catch (Exception ex) {
  77. log.info("invoke getter on " + property + " error: " + ex.toString());
  78. return false;
  79. }
  80. }
  81. return false;
  82. }
  83. /**
  84. * @desc 调用set方法
  85. */
  86. public Object getMethodValue(String property) {
  87. Object value = null;
  88. Method m = getMethods.get(property.toLowerCase());
  89. if (m != null) {
  90. try {
  91. /*
  92. * 调用obj类的setter函数
  93. */
  94. value = m.invoke(obj, new Object[]{});
  95. } catch (Exception ex) {
  96. log.info("invoke getter on " + property + " error: " + ex.toString());
  97. }
  98. }
  99. return value;
  100. }
  101. /**
  102. * 把map中的内容全部注入到obj中
  103. *
  104. * @param data
  105. * @return
  106. */
  107. public Object setAll(Map<String, Object> data) {
  108. if (data == null || data.keySet().size() <= 0) {
  109. return null;
  110. }
  111. for (Entry<String, Object> entry : data.entrySet()) {
  112. this.setMethodValue(entry.getKey(), entry.getValue());
  113. }
  114. return obj;
  115. }
  116. /**
  117. * 把map中的内容全部注入到obj中
  118. *
  119. * @param o
  120. * @param data
  121. * @return
  122. */
  123. public static Object setAll(Object o, Map<String, Object> data) {
  124. ReflectHelper reflectHelper = new ReflectHelper(o);
  125. reflectHelper.setAll(data);
  126. return o;
  127. }
  128. /**
  129. * 把map中的内容全部注入到新实例中
  130. *
  131. * @param clazz
  132. * @param data
  133. * @return
  134. */
  135. @SuppressWarnings("unchecked")
  136. public static <T> T setAll(Class<T> clazz, Map<String, Object> data) {
  137. T o = null;
  138. try {
  139. o = clazz.newInstance();
  140. } catch (Exception e) {
  141. e.printStackTrace();
  142. o = null;
  143. return o;
  144. }
  145. return (T) setAll(o, data);
  146. }
  147. /**
  148. * 根据传入的class将mapList转换为实体类list
  149. *
  150. * @param mapist
  151. * @param clazz
  152. * @return
  153. */
  154. public static <T> List<T> transList2Entrys(List<Map<String, Object>> mapist, Class<T> clazz) {
  155. List<T> list = new ArrayList<T>();
  156. if (mapist != null && mapist.size() > 0) {
  157. for (Map<String, Object> data : mapist) {
  158. list.add(ReflectHelper.setAll(clazz, data));
  159. }
  160. }
  161. return list;
  162. }
  163. /**
  164. * 根据属性名获取属性值
  165. */
  166. public static Object getFieldValueByName(String fieldName, Object o) {
  167. try {
  168. String firstLetter = fieldName.substring(0, 1).toUpperCase();
  169. String getter = "get" + firstLetter + fieldName.substring(1);
  170. Method method = o.getClass().getMethod(getter, new Class[]{});
  171. Object value = method.invoke(o, new Object[]{});
  172. return value;
  173. } catch (Exception e) {
  174. e.printStackTrace();
  175. return null;
  176. }
  177. }
  178. /**
  179. * 获取属性名数组
  180. */
  181. public static String[] getFiledName(Object o) {
  182. Field[] fields = o.getClass().getDeclaredFields();
  183. String[] fieldNames = new String[fields.length];
  184. for (int i = 0; i < fields.length; i++) {
  185. //log.info(fields[i].getType());
  186. fieldNames[i] = fields[i].getName();
  187. }
  188. return fieldNames;
  189. }
  190. /**
  191. * 获取属性类型(type),属性名(name),属性值(value)的map组成的list
  192. */
  193. public static List<Map> getFiledsInfo(Object o) {
  194. Field[] fields = o.getClass().getDeclaredFields();
  195. String[] fieldNames = new String[fields.length];
  196. List<Map> list = new ArrayList<Map>();
  197. Map<String, Object> infoMap = null;
  198. for (int i = 0; i < fields.length; i++) {
  199. infoMap = new HashMap<String, Object>();
  200. infoMap.put("type", fields[i].getType().toString());
  201. infoMap.put("name", fields[i].getName());
  202. infoMap.put("value", getFieldValueByName(fields[i].getName(), o));
  203. list.add(infoMap);
  204. }
  205. return list;
  206. }
  207. /**
  208. * 获取对象的所有属性值,返回一个对象数组
  209. */
  210. public static Object[] getFiledValues(Object o) {
  211. String[] fieldNames = getFiledName(o);
  212. Object[] value = new Object[fieldNames.length];
  213. for (int i = 0; i < fieldNames.length; i++) {
  214. value[i] = getFieldValueByName(fieldNames[i], o);
  215. }
  216. return value;
  217. }
  218. }