实体类对比工具类

package com.tiantai.policys.commons.utils.compares;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author Administrator
 * 对象参数对比
 */
@Slf4j
public class ClassCompareUtil {
	/**
	 * @Description 控制台打印模式
	 * @date 2023/1/6
	 **/
	public static void compareObjectPrint(Object oldObject, Object newObject){
		Map<String, Map<String,Object>> resultMap=compareFields(oldObject,newObject);
		if(resultMap.size()>0) {
			log.info("==================》{}","差异对比开始");
			resultMap.entrySet().forEach(x->log.info(JSON.toJSONString(x)));
			log.info("==================》{}","差异对比结束");
		}else {
			log.info("==================》{}","结果完全一致");
		}
	}
	/**
	 * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
	 * @param oldObject 进行属性比较的对象1
	 * @param newObject 进行属性比较的对象2
	 * @return 属性差异比较结果boolean
	 */
	public static boolean compareObject(Object oldObject, Object newObject) {
		Map<String, Map<String,Object>> resultMap=compareFields(oldObject,newObject);
		if(resultMap.size()>0) {
			return false;
		}else {
			return true;
		}
	}
	
	/**
	 * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
	 * @param oldObject 进行属性比较的对象1
	 * @param newObject 进行属性比较的对象2
	 * @return 属性差异比较结果map
	 */
	@SuppressWarnings("rawtypes")
	public static Map<String, Map<String,Object>> compareFields(Object oldObject, Object newObject) {
		Map<String, Map<String, Object>> map = null;
		try{	
			// 只有两个对象都是同一类型的才有可比性
			if (oldObject.getClass() == newObject.getClass()) {
				map = new HashMap<>(64);
				Class clazz = oldObject.getClass();
				//获取object的所有属性
				PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors();
				
				for (PropertyDescriptor pd : pds) {
					//遍历获取属性名
					String name = pd.getName();
					//获取属性的get方法
					Method readMethod = pd.getReadMethod();
					// 在oldObject上调用get方法等同于获得oldObject的属性值
					Object oldValue = readMethod.invoke(oldObject);
					// 在newObject上调用get方法等同于获得newObject的属性值
					Object newValue = readMethod.invoke(newObject);
					
					if(oldValue instanceof List){
						continue;
					}
					
					if(newValue instanceof List){
						continue;
					}
					
					if(oldValue instanceof Timestamp){
						oldValue = new Date(((Timestamp) oldValue).getTime());
					}
					
					if(newValue instanceof Timestamp){
						newValue = new Date(((Timestamp) newValue).getTime());
					}
					
					if(oldValue == null && newValue == null){
						continue;
					}else if(oldValue == null){
						Map<String,Object> valueMap = new HashMap<>(256);
							valueMap.put("oldValue",null);
							valueMap.put("newValue",newValue);
						
						map.put(name, valueMap);
						
						continue;
					}
					// 比较这两个值是否相等,不等就可以放入map了
					if (!oldValue.equals(newValue)) {
						Map<String,Object> valueMap = new HashMap<>(256);
							valueMap.put("oldValue",oldValue);
							valueMap.put("newValue",newValue);
						
						map.put(name, valueMap);
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return map;
	}

}

使用方式

JSONUtil.toBean 是Hutool工具类json转换实体类的工具类
SearchParamList 是json的实体类,这里就不展示了

@Test
void contextLoads(){
	FileReader fileReader = new FileReader("jsons/core/SearchCoreJson.json");
	SearchParamList array = JSONUtil.toBean(fileReader.readString(), SearchParamList.class);
	ClassCompareUtil.compareObjectPrint(array.getSearchParamVOS().get(0),array.getSearchParamVOS().get(1));
}

SearchCoreJson.json

{
  "searchParamVOS":
  [
	  {
      "airportArr": "PVG",
      "airportDept": "TFU",
      "deptDate": "2023-01-04",
      "flightNumber": ""
    },
    {
      "airportArr": "SZX",
      "airportDept": "TFU",
      "deptDate": "2023-01-04",
      "flightNumber": ""
	}
  ]
}

对比结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值