package com.pictc.utils; import org.apache.commons.collections4.CollectionUtils; import java.lang.reflect.Field; import java.util.*; /** * 对象差异比较工具类 * 支持嵌套对象和List集合的比较 */ public class ObjectDiffUtils { /** * 比较两个对象并返回差异信息 * @param obj1 第一个对象 * @param obj2 第二个对象 * @param 对象类型 * @return 差异结果列表 */ public static List compare(T obj1, T obj2) { List diffs = new ArrayList<>(); if (obj1 == null || obj2 == null) { return diffs; } try { compareFields(obj1, obj2, diffs); } catch (Exception e) { throw new RuntimeException("Failed to compare objects", e); } return diffs; } /** * 递归比较对象字段 */ private static void compareFields(Object obj1, Object obj2, List diffs) throws IllegalAccessException { Class clazz = obj1.getClass(); // 获取所有字段(包括私有字段) Field[] fields = getAllFields(clazz); for (Field field : fields) { field.setAccessible(true); Object value1 = field.get(obj1); Object value2 = field.get(obj2); String fieldName = field.getName(); // 检查字段类型 Class fieldType = field.getType(); // 如果是List类型 if (List.class.isAssignableFrom(fieldType)) { compareLists(value1, value2, fieldName, diffs); } // 如果是Map类型(可选扩展) else if (Map.class.isAssignableFrom(fieldType)) { compareMaps(value1, value2, fieldName, diffs); } // 基本类型、String、包装类型等 else { compareBasicValues(value1, value2, fieldName, diffs); } } } /** * 比较两个List */ private static void compareLists(Object list1, Object list2, String fieldName, List diffs) { List l1 = (List) list1; List l2 = (List) list2; if (l1 == null || l2 == null) { return; } // 比较List大小 if (l1.size() != l2.size()) { diffs.add(fieldName); return; } // 比较List中的每个元素 for (int i = 0; i < l1.size(); i++) { List result = compare(l1.get(i), l2.get(i)); if (CollectionUtils.isNotEmpty(result)) { for (String s : result) { diffs.add(fieldName + "["+ i +"]." + s); } } } } /** * 比较两个Map(可选功能) */ private static void compareMaps(Object map1, Object map2, String path, List diffs) { // Map比较的实现,可根据需要扩展 } /** * 比较基本值 */ private static void compareBasicValues(Object value1, Object value2, String fieldName, List diffs) { if (!Objects.equals(value1, value2)) { diffs.add(fieldName); } } /** * 获取类及其父类的所有字段 */ private static Field[] getAllFields(Class clazz) { List fields = new ArrayList<>(); while (clazz != null && clazz != Object.class) { fields.addAll(Arrays.asList(clazz.getDeclaredFields())); clazz = clazz.getSuperclass(); } return fields.toArray(new Field[0]); } }