123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- package com.steerinfo.ems.Utils;
- import java.beans.Introspector;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Method;
- import java.sql.Timestamp;
- import java.util.*;
- /**
- * @author Shadow
- * @create 2021-11-08 10:52
- * @project xt-ems-api-new
- */
- public class CompareUtil {
- /**
- * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
- *
- * @param oldObject 进行属性比较的对象1
- * @param newObject 进行属性比较的对象2
- * @return 属性差异比较结果boolean
- */
- public static boolean compareObject(Object oldObject, Object newObject) {
- Map<String, List<Object>> resultMap = compareFields(oldObject, newObject, null);
- if (resultMap.size() > 0) {
- return false;
- } else {
- return true;
- }
- }
- /**
- * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
- *
- * @param obj1 进行属性比较的对象1
- * @param obj2 进行属性比较的对象2
- * @param ignoreArr 忽略比较的字段
- * @return 属性差异比较结果map
- */
- @SuppressWarnings("rawtypes")
- public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {
- try {
- Map<String, List<Object>> map = new HashMap<String, List<Object>>();
- List<String> ignoreList = null;
- if (ignoreArr != null && ignoreArr.length > 0) {
- // array转化为list
- ignoreList = Arrays.asList(ignoreArr);
- }
- // 只有两个对象都是同一类型的才有可比性
- if (obj1.getClass() == obj2.getClass()) {
- Class clazz = obj1.getClass();
- // 获取object的属性描述
- PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
- Object.class).getPropertyDescriptors();
- // 这里就是所有的属性了
- for (PropertyDescriptor pd : pds) {
- // 属性名
- String name = pd.getName();
- // 如果当前属性选择忽略比较,跳到下一次循环
- if (ignoreList != null && ignoreList.contains(name)) {
- continue;
- }
- // get方法
- Method readMethod = pd.getReadMethod();
- // 在obj1上调用get方法等同于获得obj1的属性值
- Object o1 = readMethod.invoke(obj1);
- // 在obj2上调用get方法等同于获得obj2的属性值
- Object o2 = readMethod.invoke(obj2);
- if (o1 instanceof Timestamp) {
- o1 = new Date(((Timestamp) o1).getTime());
- }
- if (o2 instanceof Timestamp) {
- o2 = new Date(((Timestamp) o2).getTime());
- }
- if (o1 == null && o2 == null) {
- continue;
- } else if (o1 == null && o2 != null) {
- List<Object> list = new ArrayList<Object>();
- list.add(o1);
- list.add(o2);
- map.put(name, list);
- continue;
- }
- // 比较这两个值是否相等,不等就可以放入map了
- if (!o1.equals(o2)) {
- List<Object> list = new ArrayList<Object>();
- list.add(o1);
- list.add(o2);
- map.put(name, list);
- }
- }
- }
- return map;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- /**
- * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
- *
- * @param obj1 进行属性比较的对象1,旧对象
- * @param obj2 进行属性比较的对象2,新对象
- * @param ignoreArr 忽略比较的字段
- * @param i 无意义字段,用于区分方法
- * @return 属性差异比较结果的新值map
- */
- @SuppressWarnings("rawtypes")
- public static Map<String, Object> compareFields(Object obj1, Object obj2, String[] ignoreArr,Integer i) {
- try {
- Map<String, Object> map = new HashMap<String,Object>();
- List<String> ignoreList = null;
- if (ignoreArr != null && ignoreArr.length > 0) {
- // array转化为list
- ignoreList = Arrays.asList(ignoreArr);
- }
- // 只有两个对象都是同一类型的才有可比性
- if (obj1.getClass() == obj2.getClass()) {
- Class clazz = obj1.getClass();
- // 获取object的属性描述
- PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
- Object.class).getPropertyDescriptors();
- // 这里就是所有的属性了
- for (PropertyDescriptor pd : pds) {
- // 属性名
- String name = pd.getName();
- // 如果当前属性选择忽略比较,跳到下一次循环
- if (ignoreList != null && ignoreList.contains(name)) {
- continue;
- }
- // get方法
- Method readMethod = pd.getReadMethod();
- // 在obj1上调用get方法等同于获得obj1的属性值
- Object o1 = readMethod.invoke(obj1);
- // 在obj2上调用get方法等同于获得obj2的属性值
- Object o2 = readMethod.invoke(obj2);
- if (o1 instanceof Timestamp) {
- o1 = new Date(((Timestamp) o1).getTime());
- }
- if (o2 instanceof Timestamp) {
- o2 = new Date(((Timestamp) o2).getTime());
- }
- if (o1 == null && o2 == null) {
- continue;
- } else if (o1 == null && o2 != null) {
- map.put(name, o2);
- continue;
- }
- //// 比较这两个值是否相等,不等就可以放入map了
- //if (!o1.equals(o2)) {
- // map.put(name, o2);
- //}
- }
- }
- return map;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- }
|