public class FieldComparisonUtil {
/**
• 直接返回一个新的对象,并且对象的值 只有被修改的部分
•
• @param old
• @param source
• @param isParent
• @param target 目标对象
• @return
/**
• @param old 进行属性比较的原始数据
• @param source 进行属性比较的新数据
• @param isParent 是否存在父类
• @return
*/
public static Map compareFields(Object old, Object source, Boolean isParent) {
Map map = new HashMap<>(8);
try {
// 只有两个对象都是同一类型的才有可比性
if (old.getClass() == source.getClass()) {
List fieldList = new ArrayList<>();
Class<?> clazz = old.getClass();
// 获取字段
Field[] fields = clazz.getDeclaredFields();
fieldList.addAll(Arrays.asList(fields));
// 获取父类字段
if (isParent) {
Class<?> superclass = clazz.getSuperclass();
Field[] parentFields = superclass.getDeclaredFields();
fieldList.addAll(Arrays.asList(parentFields));
}
// 这里就是所有的属性了
for (Field field : fieldList) {
boolean annotationPresent = field.isAnnotationPresent(FieldComparison.class);
// 没有注解的字段表示,不参与比较
if (!annotationPresent) {
continue;
}
field.setAccessible(true);
// 属性名
String fieldName = field.getName();
// 在old上调用get方法等同于获得old的属性值
Object objBefore = field.get(old);
// 在source上调用get方法等同于获得source的属性值
Object objAfter = field.get(source);
// 比较字段同时为空时,则表示是一样的值
if (objAfter instanceof String) {
if (StringUtils.isEmpty(objBefore) && StringUtils.isEmpty(objAfter)) {
continue;
}
}
// 比较是否一致
boolean equals = Objects.equals(objBefore, objAfter);
// 不一致则进行记录
if (!equals) {
if (objAfter != null) {
/**
* 如果要使用字符串记录,那么对特殊的数据,需要进行转换
if (objAfter instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate = sdf.format((Date) objAfter);
map.put(fieldName, formatDate);
} else if (objAfter instanceof LocalDateTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatDate = ((LocalDateTime) objAfter).format(formatter);
map.put(fieldName, formatDate);
} else if (objAfter instanceof LocalDate) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatDate = ((LocalDate) objAfter).format(formatter);
map.put(fieldName, formatDate);
}
**/
map.put(fieldName, objAfter);
}
}
}
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return map;
}
标签:old,SpringBoot,自定义,field,param,source,formatDate,注解,objAfter
From: https://blog.51cto.com/u_16265692/8202171