Files
geg-gas-pcitc/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/utils/ObjectDiffUtils.java
张秉卓 ca095be435 修改
2026-01-22 17:24:51 +08:00

116 lines
3.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 <T> 对象类型
* @return 差异结果列表
*/
public static <T> List<String> compare(T obj1, T obj2) {
List<String> 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<String> 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<String> 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<String> 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<String> diffs) {
// Map比较的实现可根据需要扩展
}
/**
* 比较基本值
*/
private static void compareBasicValues(Object value1, Object value2, String fieldName, List<String> diffs) {
if (!Objects.equals(value1, value2)) {
diffs.add(fieldName);
}
}
/**
* 获取类及其父类的所有字段
*/
private static Field[] getAllFields(Class<?> clazz) {
List<Field> fields = new ArrayList<>();
while (clazz != null && clazz != Object.class) {
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass();
}
return fields.toArray(new Field[0]);
}
}