BeanUtil.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package cn.efunbox.manage.common.utils;
  2. import org.springframework.cglib.beans.BeanCopier;
  3. import org.springframework.cglib.beans.BeanMap;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.concurrent.ConcurrentHashMap;
  9. /**
  10. *
  11. * 对象操作工具
  12. *
  13. */
  14. public class BeanUtil {
  15. /**
  16. * 缓存BeanCopier对象,加快对象浅拷贝效率
  17. */
  18. private static final Map<String, BeanCopier> BEAN_COPIERS = new ConcurrentHashMap<>();
  19. /**
  20. * 缓存BeanMap对象,加快Map和javaBean对象的转化
  21. */
  22. private static final Map<String, BeanMap> BEAN_MAP = new ConcurrentHashMap<>();
  23. private BeanUtil(){};
  24. /**
  25. * 浅拷贝 只拷贝相同属性名和类型的
  26. *
  27. * @param srcObj
  28. * 被拷贝对象
  29. *
  30. * @param destObj
  31. * 拷贝对象
  32. *
  33. */
  34. public static void copy(Object srcObj, Object destObj) {
  35. if (srcObj == null || destObj == null) {
  36. return;
  37. }
  38. String key = srcObj.getClass().getName() + destObj.getClass().getName();
  39. BeanCopier copier = null;
  40. if (BEAN_COPIERS.get(key)==null) {
  41. synchronized (BeanUtil.class) {
  42. if(BEAN_COPIERS.get(key)==null){
  43. copier = BeanCopier.create(srcObj.getClass(), destObj.getClass(), false);
  44. BEAN_COPIERS.put(key, copier);
  45. }
  46. }
  47. } else {
  48. copier = BEAN_COPIERS.get(key);
  49. }
  50. copier.copy(srcObj, destObj, null);
  51. }
  52. /**
  53. * 对象转map
  54. * @param obj
  55. * @param fieldNames 需要存入的属性名 属性名之间以,分隔
  56. * @param <T>
  57. * @return
  58. */
  59. public static <T> Map<String, Object> getMapByField(T obj, String fieldNames) {
  60. Map<String, Object> map = new HashMap<String, Object>();
  61. if (obj == null || fieldNames == null) {
  62. return map;
  63. }
  64. BeanMap beanMap = null;
  65. beanMap=getBeanMap(obj);
  66. for (String f : fieldNames.split(",")) {
  67. map.put(f, beanMap.get(f));
  68. }
  69. return map;
  70. }
  71. /**
  72. * 对象转map
  73. * @param obj
  74. * @param removefieldNames 不需要存入的属性名 属性名之间以,分隔
  75. * @param <T>
  76. * @return
  77. */
  78. public static <T> Map<String, Object> getMapByRemoveField(T obj, String removefieldNames) {
  79. Map<String, Object> map = new HashMap<String, Object>();
  80. if (obj == null) {
  81. return map;
  82. }
  83. BeanMap beanMap = null;
  84. beanMap=getBeanMap(obj);
  85. for (Object key : beanMap.keySet()) {
  86. map.put(key + "", beanMap.get(key));
  87. }
  88. if(removefieldNames!=null){
  89. for(String key:removefieldNames.split(",")){
  90. map.remove(key);
  91. }
  92. }
  93. return map;
  94. }
  95. /**
  96. * 对象转map
  97. *
  98. * @param srcObj
  99. * @return
  100. */
  101. public static Map<String, Object> getMap(Object srcObj) {
  102. return getMapByRemoveField(srcObj, null);
  103. }
  104. /**
  105. * map转对象
  106. *
  107. * @param map
  108. * @param obj
  109. * 需要转换的空对象
  110. *
  111. * @return
  112. */
  113. public static <T> T mapToObj(Map<String, Object> map, T obj) {
  114. if (obj == null || map == null) {
  115. return null;
  116. }
  117. BeanMap beanMap = null;
  118. beanMap=getBeanMap(obj);
  119. beanMap.putAll(map);
  120. return obj;
  121. }
  122. /**
  123. * 对象集合转map集合
  124. *
  125. * @param objList
  126. * @return
  127. */
  128. public static <T> List<Map<String, Object>> objectsToMaps(List<T> objList) {
  129. List<Map<String, Object>> list = new ArrayList<>();
  130. if (objList != null && objList.size() > 0) {
  131. Map<String, Object> map = null;
  132. T obj = null;
  133. for (int i = 0, size = objList.size(); i < size; i++) {
  134. obj = objList.get(i);
  135. map = getMap(obj);
  136. list.add(map);
  137. }
  138. }
  139. return list;
  140. }
  141. /**
  142. * map集合转对象集合
  143. *
  144. * @param maps
  145. * @param clazz
  146. * 转换的对象class
  147. * @return
  148. */
  149. public static <T> List<T> mapsToObjects(List<Map<String, Object>> maps, Class<T> clazz) {
  150. List<T> list = new ArrayList<>();
  151. if (maps != null && maps.size() > 0) {
  152. Map<String, Object> map = null;
  153. T bean = null;
  154. try {
  155. for (int i = 0, size = maps.size(); i < size; i++) {
  156. map = maps.get(i);
  157. bean = clazz.newInstance();
  158. mapToObj(map, bean);
  159. list.add(bean);
  160. }
  161. } catch (Exception e) {
  162. e.printStackTrace();
  163. }
  164. }
  165. return list;
  166. }
  167. private static BeanMap getBeanMap(Object obj){
  168. BeanMap beanMap=null;
  169. String key=obj.getClass().getName();
  170. if (BEAN_MAP.get(key)==null) {
  171. synchronized (BeanUtil.class) {
  172. if(BEAN_MAP.get(key)==null){
  173. beanMap = BeanMap.create(obj);
  174. BEAN_MAP.put(key, beanMap);
  175. }
  176. }
  177. } else {
  178. beanMap =BEAN_MAP.get(key);
  179. }
  180. return beanMap;
  181. }
  182. }