对象比较器,常用于日志记录,记录对象的属性变化
1 主要代码:
package com.lovcreate.atom.web.utils;
import io.swagger.annotations.ApiModelProperty;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
public class LogUtil {
/**
* 对象比较器
* 比较结果eg:用户名,由:liu,改为:gu;地址,由:hunan,改为:neimenggu
* @param oldBean
* @param newBean
* @return
*/
public static String compareObject(Object oldBean, Object newBean, List<String> ignoreList) {
String str = "";
try {
if (oldBean.getClass() == newBean.getClass()) {// 只有两个对象都是同一类型的才有可比性
Class clazz = oldBean.getClass();
Field[] fields = oldBean.getClass().getDeclaredFields();
int i = 1;
for (Field field : fields) {
if ("serialVersionUID".equals(field.getName())) {
continue;
}
String name = field.getName();// 属性名
// 通用无需比较的字段,根据实际需要删减
ignoreList.add("id");
ignoreList.add("createTime");
ignoreList.add("updateTime");
ignoreList.add("createid");
ignoreList.add("updateid");
ignoreList.add("isDel");
if(ignoreList != null && ignoreList.contains(name)){// 如果当前属性选择忽略比较,跳到下一次循环
continue;
}
// 获取bean的某个属性的描述符
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
// 获得用于读取属性值的方法
Method getMethod = pd.getReadMethod();
// 读取属性值
Object o1 = getMethod.invoke(oldBean);
Object o2 = getMethod.invoke(newBean);
if (o1 == null && o2 == null) {
continue;
}
String s1 = o1 == null ? "" : o1.toString();//避免空指针异常
String s2 = o2 == null ? "" : o2.toString();//避免空指针异常
if (!s1.equals(s2)) {
if (i != 1) {
str += ";";
}
// 获取注解值
String fieldName = field.getAnnotation(ApiModelProperty.class) == null ? field.getName() : field.getAnnotation(ApiModelProperty.class).value();
str += fieldName + ",由:" + s1 + ",改为:" + s2;
i++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
}
2 测试
@Test
public void testobjectCompare() {
LupitAnnualSetting lupitAnnualSetting1 = new LupitAnnualSetting();
LupitAnnualSetting lupitAnnualSetting2 = new LupitAnnualSetting();
lupitAnnualSetting1.setYear("2020");
lupitAnnualSetting1.setName("这一年");
lupitAnnualSetting2.setYear("2022");
lupitAnnualSetting2.setName("这一年2");
System.out.println(LogUtil.compareObject(lupitAnnualSetting1, lupitAnnualSetting2, null));
}
结果:年份,由:2020,改为:2022;name,由:这一年,改为:这一年2