方法逻辑
public static String addRecord(Object oldObj, Object newObj) {
StringBuilder info = new StringBuilder();
try {
// 得到类对象
Class<? extends Object> class1 = oldObj.getClass();
Class<? extends Object> class2 = newObj.getClass();
if (!class1.equals(class2)) {
throw new RuntimeException("请传入两个相同的实体类对象");
}
// 得到属性集合
Field[] fields1 = class1.getDeclaredFields();
Field[] fields2 = class2.getDeclaredFields();
Long id = null;
for (Field field1 : fields1) {
// 设置属性是可以访问的(私有的也可以)
field1.setAccessible(true);
if (id == null && field1.getName().equals("id")) {
id = (Long) field1.get(oldObj);
}
for (Field field2 : fields2) {
// 设置属性是可以访问的(私有的也可以)
field2.setAccessible(true);
// 比较属性名是否一样
if (field1.equals(field2)) {
if ((field2.get(newObj) == null || StringUtils.isEmpty(field2.get(newObj) + ""))
&& (field1.get(oldObj) == null || StringUtils.isEmpty(field1.get(oldObj) + ""))) {
break;
}
// 比较值是否一样
if (!field1.get(oldObj).equals(field2.get(newObj))) {
// 得到注解
EditCompare pn = field1.getAnnotation(EditCompare.class);
if (pn != null) {
info.append("【").append(pn.value()).append("】:\"").append(field1.get(oldObj)).append("\" 修改为 \"").append(field2.get(newObj)).append("\",");
}
}
break;
}
}
}
} catch (RuntimeException e) {
e.printStackTrace();
log.error(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
log.error("属性内容更改前后验证错误,日志无法被记录!");
}
return StringUtils.isBlank(info) ? "" : info.substring(0, info.length() - 1);
}
对象上添加此注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EditCompare {
/**
* 汉字全称
*/
String value();
}
实现后的效果为: