CompareUtil.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package com.steerinfo.ems.Utils;
  2. import java.beans.Introspector;
  3. import java.beans.PropertyDescriptor;
  4. import java.lang.reflect.Method;
  5. import java.sql.Timestamp;
  6. import java.util.*;
  7. /**
  8. * @author Shadow
  9. * @create 2021-11-08 10:52
  10. * @project xt-ems-api-new
  11. */
  12. public class CompareUtil {
  13. /**
  14. * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
  15. *
  16. * @param oldObject 进行属性比较的对象1
  17. * @param newObject 进行属性比较的对象2
  18. * @return 属性差异比较结果boolean
  19. */
  20. public static boolean compareObject(Object oldObject, Object newObject) {
  21. Map<String, List<Object>> resultMap = compareFields(oldObject, newObject, null);
  22. if (resultMap.size() > 0) {
  23. return false;
  24. } else {
  25. return true;
  26. }
  27. }
  28. /**
  29. * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
  30. *
  31. * @param obj1 进行属性比较的对象1
  32. * @param obj2 进行属性比较的对象2
  33. * @param ignoreArr 忽略比较的字段
  34. * @return 属性差异比较结果map
  35. */
  36. @SuppressWarnings("rawtypes")
  37. public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {
  38. try {
  39. Map<String, List<Object>> map = new HashMap<String, List<Object>>();
  40. List<String> ignoreList = null;
  41. if (ignoreArr != null && ignoreArr.length > 0) {
  42. // array转化为list
  43. ignoreList = Arrays.asList(ignoreArr);
  44. }
  45. // 只有两个对象都是同一类型的才有可比性
  46. if (obj1.getClass() == obj2.getClass()) {
  47. Class clazz = obj1.getClass();
  48. // 获取object的属性描述
  49. PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
  50. Object.class).getPropertyDescriptors();
  51. // 这里就是所有的属性了
  52. for (PropertyDescriptor pd : pds) {
  53. // 属性名
  54. String name = pd.getName();
  55. // 如果当前属性选择忽略比较,跳到下一次循环
  56. if (ignoreList != null && ignoreList.contains(name)) {
  57. continue;
  58. }
  59. // get方法
  60. Method readMethod = pd.getReadMethod();
  61. // 在obj1上调用get方法等同于获得obj1的属性值
  62. Object o1 = readMethod.invoke(obj1);
  63. // 在obj2上调用get方法等同于获得obj2的属性值
  64. Object o2 = readMethod.invoke(obj2);
  65. if (o1 instanceof Timestamp) {
  66. o1 = new Date(((Timestamp) o1).getTime());
  67. }
  68. if (o2 instanceof Timestamp) {
  69. o2 = new Date(((Timestamp) o2).getTime());
  70. }
  71. if (o1 == null && o2 == null) {
  72. continue;
  73. } else if (o1 == null && o2 != null) {
  74. List<Object> list = new ArrayList<Object>();
  75. list.add(o1);
  76. list.add(o2);
  77. map.put(name, list);
  78. continue;
  79. }
  80. // 比较这两个值是否相等,不等就可以放入map了
  81. if (!o1.equals(o2)) {
  82. List<Object> list = new ArrayList<Object>();
  83. list.add(o1);
  84. list.add(o2);
  85. map.put(name, list);
  86. }
  87. }
  88. }
  89. return map;
  90. } catch (Exception e) {
  91. e.printStackTrace();
  92. return null;
  93. }
  94. }
  95. /**
  96. * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
  97. *
  98. * @param obj1 进行属性比较的对象1,旧对象
  99. * @param obj2 进行属性比较的对象2,新对象
  100. * @param ignoreArr 忽略比较的字段
  101. * @param i 无意义字段,用于区分方法
  102. * @return 属性差异比较结果的新值map
  103. */
  104. @SuppressWarnings("rawtypes")
  105. public static Map<String, Object> compareFields(Object obj1, Object obj2, String[] ignoreArr,Integer i) {
  106. try {
  107. Map<String, Object> map = new HashMap<String,Object>();
  108. List<String> ignoreList = null;
  109. if (ignoreArr != null && ignoreArr.length > 0) {
  110. // array转化为list
  111. ignoreList = Arrays.asList(ignoreArr);
  112. }
  113. // 只有两个对象都是同一类型的才有可比性
  114. if (obj1.getClass() == obj2.getClass()) {
  115. Class clazz = obj1.getClass();
  116. // 获取object的属性描述
  117. PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
  118. Object.class).getPropertyDescriptors();
  119. // 这里就是所有的属性了
  120. for (PropertyDescriptor pd : pds) {
  121. // 属性名
  122. String name = pd.getName();
  123. // 如果当前属性选择忽略比较,跳到下一次循环
  124. if (ignoreList != null && ignoreList.contains(name)) {
  125. continue;
  126. }
  127. // get方法
  128. Method readMethod = pd.getReadMethod();
  129. // 在obj1上调用get方法等同于获得obj1的属性值
  130. Object o1 = readMethod.invoke(obj1);
  131. // 在obj2上调用get方法等同于获得obj2的属性值
  132. Object o2 = readMethod.invoke(obj2);
  133. if (o1 instanceof Timestamp) {
  134. o1 = new Date(((Timestamp) o1).getTime());
  135. }
  136. if (o2 instanceof Timestamp) {
  137. o2 = new Date(((Timestamp) o2).getTime());
  138. }
  139. if (o1 == null && o2 == null) {
  140. continue;
  141. } else if (o1 == null && o2 != null) {
  142. map.put(name, o2);
  143. continue;
  144. }
  145. //// 比较这两个值是否相等,不等就可以放入map了
  146. //if (!o1.equals(o2)) {
  147. // map.put(name, o2);
  148. //}
  149. }
  150. }
  151. return map;
  152. } catch (Exception e) {
  153. e.printStackTrace();
  154. return null;
  155. }
  156. }
  157. }