修改
This commit is contained in:
@ -0,0 +1,28 @@
|
||||
package com.xjrsoft.module.datalog.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class CompareResultVo<T> {
|
||||
|
||||
/**
|
||||
* 最新版本
|
||||
*/
|
||||
@ApiModelProperty("最新版本")
|
||||
private T newBean;
|
||||
|
||||
/**
|
||||
* 旧版本
|
||||
*/
|
||||
@ApiModelProperty("旧版本")
|
||||
private T oldBean;
|
||||
|
||||
/**
|
||||
* 比对结果
|
||||
*/
|
||||
@ApiModelProperty("比对结果")
|
||||
private List<String> diffResultList;
|
||||
}
|
||||
@ -0,0 +1,116 @@
|
||||
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]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user