FieldHelper.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. package com.nuliji.tools.mybatis;
  2. import tk.mybatis.mapper.MapperException;
  3. import javax.persistence.Entity;
  4. import java.beans.BeanInfo;
  5. import java.beans.IntrospectionException;
  6. import java.beans.Introspector;
  7. import java.beans.PropertyDescriptor;
  8. import java.lang.reflect.*;
  9. import java.util.*;
  10. /**
  11. * Created by gaojie on 2017/11/9.
  12. */
  13. public class FieldHelper {
  14. private static final IFieldHelper fieldHelper;
  15. static {
  16. String version = System.getProperty("java.version");
  17. if (version.contains("1.8.")) {
  18. fieldHelper = new Jdk8FieldHelper();
  19. } else {
  20. fieldHelper = new Jdk6_7FieldHelper();
  21. }
  22. }
  23. /**
  24. * 获取全部的Field
  25. *
  26. * @param entityClass
  27. * @return
  28. */
  29. public static List<EntityField> getFields(Class<?> entityClass) {
  30. return fieldHelper.getFields(entityClass);
  31. }
  32. /**
  33. * 获取全部的属性,通过方法名获取
  34. *
  35. * @param entityClass
  36. * @return
  37. */
  38. public static List<EntityField> getProperties(Class<?> entityClass) {
  39. return fieldHelper.getProperties(entityClass);
  40. }
  41. /**
  42. * 获取全部的属性,包含字段和方法
  43. *
  44. * @param entityClass
  45. * @return
  46. * @throws IntrospectionException
  47. */
  48. public static List<EntityField> getAll(Class<?> entityClass) {
  49. List<EntityField> fields = fieldHelper.getFields(entityClass);
  50. List<EntityField> properties = fieldHelper.getProperties(entityClass);
  51. //拼到一起,名字相同的合并
  52. List<EntityField> all = new ArrayList<EntityField>();
  53. Set<EntityField> usedSet = new HashSet<EntityField>();
  54. for (EntityField field : fields) {
  55. for (EntityField property : properties) {
  56. if (!usedSet.contains(property) && field.getName().equals(property.getName())) {
  57. field.copyFromPropertyDescriptor(property);
  58. usedSet.add(property);
  59. break;
  60. }
  61. }
  62. all.add(field);
  63. }
  64. for (EntityField property : properties) {
  65. if (!usedSet.contains(property)) {
  66. all.add(property);
  67. }
  68. }
  69. return all;
  70. }
  71. /**
  72. * Field接口
  73. */
  74. interface IFieldHelper {
  75. /**
  76. * 获取全部的Field
  77. *
  78. * @param entityClass
  79. * @return
  80. */
  81. List<EntityField> getFields(Class<?> entityClass);
  82. /**
  83. * 获取全部的属性,通过方法名获取
  84. *
  85. * @param entityClass
  86. * @return
  87. */
  88. List<EntityField> getProperties(Class<?> entityClass);
  89. }
  90. /**
  91. * 支持jdk8
  92. */
  93. static class Jdk8FieldHelper implements IFieldHelper {
  94. /**
  95. * 获取全部的Field
  96. *
  97. * @param entityClass
  98. * @return
  99. */
  100. public List<EntityField> getFields(Class<?> entityClass) {
  101. List<EntityField> fields = _getFields(entityClass, null, null);
  102. List<EntityField> properties = getProperties(entityClass);
  103. Set<EntityField> usedSet = new HashSet<EntityField>();
  104. for (EntityField field : fields) {
  105. for (EntityField property : properties) {
  106. if (!usedSet.contains(property) && field.getName().equals(property.getName())) {
  107. //泛型的情况下通过属性可以得到实际的类型
  108. field.setJavaType(property.getJavaType());
  109. break;
  110. }
  111. }
  112. }
  113. return fields;
  114. }
  115. /**
  116. * 获取全部的Field,仅仅通过Field获取
  117. *
  118. * @param entityClass
  119. * @param fieldList
  120. * @param level
  121. * @return
  122. */
  123. private List<EntityField> _getFields(Class<?> entityClass, List<EntityField> fieldList, Integer level) {
  124. if (fieldList == null) {
  125. fieldList = new ArrayList<EntityField>();
  126. }
  127. if (level == null) {
  128. level = 0;
  129. }
  130. if (entityClass.equals(Object.class)) {
  131. return fieldList;
  132. }
  133. Field[] fields = entityClass.getDeclaredFields();
  134. int index = 0;
  135. for (int i = 0; i < fields.length; i++) {
  136. Field field = fields[i];
  137. //排除静态字段,解决bug#2
  138. if (!Modifier.isStatic(field.getModifiers())) {
  139. if (level.intValue() != 0) {
  140. //将父类的字段放在前面
  141. fieldList.add(index, new EntityField(field, null));
  142. index++;
  143. } else {
  144. fieldList.add(new EntityField(field, null));
  145. }
  146. }
  147. }
  148. Class<?> superClass = entityClass.getSuperclass();
  149. if (superClass != null
  150. && !superClass.equals(Object.class)
  151. && (superClass.isAnnotationPresent(Entity.class)
  152. || (!Map.class.isAssignableFrom(superClass)
  153. && !Collection.class.isAssignableFrom(superClass)))) {
  154. return _getFields(entityClass.getSuperclass(), fieldList, ++level);
  155. }
  156. return fieldList;
  157. }
  158. /**
  159. * 通过方法获取属性
  160. *
  161. * @param entityClass
  162. * @return
  163. */
  164. public List<EntityField> getProperties(Class<?> entityClass) {
  165. List<EntityField> entityFields = new ArrayList<EntityField>();
  166. BeanInfo beanInfo = null;
  167. try {
  168. beanInfo = Introspector.getBeanInfo(entityClass);
  169. } catch (IntrospectionException e) {
  170. throw new MapperException(e);
  171. }
  172. PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
  173. for (PropertyDescriptor desc : descriptors) {
  174. if (!desc.getName().equals("class")) {
  175. entityFields.add(new EntityField(null, desc));
  176. }
  177. }
  178. return entityFields;
  179. }
  180. }
  181. /**
  182. * 支持jdk6,7
  183. */
  184. static class Jdk6_7FieldHelper implements IFieldHelper {
  185. @Override
  186. public List<EntityField> getFields(Class<?> entityClass) {
  187. List<EntityField> fieldList = new ArrayList<EntityField>();
  188. _getFields(entityClass, fieldList, _getGenericTypeMap(entityClass), null);
  189. return fieldList;
  190. }
  191. /**
  192. * 通过方法获取属性
  193. *
  194. * @param entityClass
  195. * @return
  196. */
  197. public List<EntityField> getProperties(Class<?> entityClass) {
  198. Map<String, Class<?>> genericMap = _getGenericTypeMap(entityClass);
  199. List<EntityField> entityFields = new ArrayList<EntityField>();
  200. BeanInfo beanInfo;
  201. try {
  202. beanInfo = Introspector.getBeanInfo(entityClass);
  203. } catch (IntrospectionException e) {
  204. throw new MapperException(e);
  205. }
  206. PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
  207. for (PropertyDescriptor desc : descriptors) {
  208. if (desc != null && !"class".equals(desc.getName())) {
  209. EntityField entityField = new EntityField(null, desc);
  210. if (desc.getReadMethod() != null
  211. && desc.getReadMethod().getGenericReturnType() != null
  212. && desc.getReadMethod().getGenericReturnType() instanceof TypeVariable) {
  213. entityField.setJavaType(genericMap.get(((TypeVariable) desc.getReadMethod().getGenericReturnType()).getName()));
  214. } else if (desc.getWriteMethod() != null
  215. && desc.getWriteMethod().getGenericParameterTypes() != null
  216. && desc.getWriteMethod().getGenericParameterTypes().length == 1
  217. && desc.getWriteMethod().getGenericParameterTypes()[0] instanceof TypeVariable) {
  218. entityField.setJavaType(genericMap.get(((TypeVariable) desc.getWriteMethod().getGenericParameterTypes()[0]).getName()));
  219. }
  220. entityFields.add(entityField);
  221. }
  222. }
  223. return entityFields;
  224. }
  225. /**
  226. * @param entityClass
  227. * @param fieldList
  228. * @param genericMap
  229. * @param level
  230. */
  231. private void _getFields(Class<?> entityClass, List<EntityField> fieldList, Map<String, Class<?>> genericMap, Integer level) {
  232. if (fieldList == null) {
  233. throw new NullPointerException("fieldList参数不能为空!");
  234. }
  235. if (level == null) {
  236. level = 0;
  237. }
  238. if (entityClass == Object.class) {
  239. return;
  240. }
  241. Field[] fields = entityClass.getDeclaredFields();
  242. int index = 0;
  243. for (Field field : fields) {
  244. //忽略static和transient字段#106
  245. if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isTransient(field.getModifiers())) {
  246. EntityField entityField = new EntityField(field, null);
  247. if (field.getGenericType() != null && field.getGenericType() instanceof TypeVariable) {
  248. if (genericMap == null || !genericMap.containsKey(((TypeVariable) field.getGenericType()).getName())) {
  249. throw new MapperException(entityClass + "字段" + field.getName() + "的泛型类型无法获取!");
  250. } else {
  251. entityField.setJavaType(genericMap.get(((TypeVariable) field.getGenericType()).getName()));
  252. }
  253. } else {
  254. entityField.setJavaType(field.getType());
  255. }
  256. if (level.intValue() != 0) {
  257. //将父类的字段放在前面
  258. fieldList.add(index, entityField);
  259. index++;
  260. } else {
  261. fieldList.add(entityField);
  262. }
  263. }
  264. }
  265. //获取父类和泛型信息
  266. Class<?> superClass = entityClass.getSuperclass();
  267. //判断superClass
  268. if (superClass != null
  269. && !superClass.equals(Object.class)
  270. && (superClass.isAnnotationPresent(Entity.class)
  271. || (!Map.class.isAssignableFrom(superClass)
  272. && !Collection.class.isAssignableFrom(superClass)))) {
  273. level++;
  274. _getFields(superClass, fieldList, genericMap, level);
  275. }
  276. }
  277. /**
  278. * 获取所有泛型类型映射
  279. *
  280. * @param entityClass
  281. */
  282. private Map<String, Class<?>> _getGenericTypeMap(Class<?> entityClass) {
  283. Map<String, Class<?>> genericMap = new HashMap<String, Class<?>>();
  284. if (entityClass == Object.class) {
  285. return genericMap;
  286. }
  287. //获取父类和泛型信息
  288. Class<?> superClass = entityClass.getSuperclass();
  289. //判断superClass
  290. if (superClass != null
  291. && !superClass.equals(Object.class)
  292. && (superClass.isAnnotationPresent(Entity.class)
  293. || (!Map.class.isAssignableFrom(superClass)
  294. && !Collection.class.isAssignableFrom(superClass)))) {
  295. if (entityClass.getGenericSuperclass() instanceof ParameterizedType) {
  296. Type[] types = ((ParameterizedType) entityClass.getGenericSuperclass()).getActualTypeArguments();
  297. TypeVariable[] typeVariables = superClass.getTypeParameters();
  298. if (typeVariables.length > 0) {
  299. for (int i = 0; i < typeVariables.length; i++) {
  300. if (types[i] instanceof Class) {
  301. genericMap.put(typeVariables[i].getName(), (Class<?>) types[i]);
  302. }
  303. }
  304. }
  305. }
  306. genericMap.putAll(_getGenericTypeMap(superClass));
  307. }
  308. return genericMap;
  309. }
  310. }
  311. }