1.单个变量值前后工具类代码
1.1 自定义注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ForUpdate {
String fieldName() default "";
}
1.2 工具方法
日志示例:
修改年龄"10"为"20";
具体日志格式不同,小伙伴们可以自行修改builder。
/**
* 获取变更内容
*
* @param beforeBean 更改前的Bean
* @param afterBean 更改后的Bean
* @param <T>修改姓名"小白"为"小黑";修改年龄"10"为"20";
* @return
*/
public static <T> String getSingleFields(T beforeBean, T afterBean) {
Field[] fields = beforeBean.getClass().getDeclaredFields();
StringBuilder builder = new StringBuilder();
for (Field field : fields) {
field.setAccessible(true);
if (field.isAnnotationPresent(ForUpdate.class)) {
try {
Object newValue = field.get(beforeBean);
Object oldValue = field.get(afterBean);
if (!Objects.equals(newValue, oldValue)) {
builder.append("修改");
builder.append(field.getAnnotation(ForUpdate.class).fieldName()); //获取字段名称
builder.append("\"");
builder.append(newValue);
builder.append("\"");
builder.append("为\"");
builder.append(oldValue);
builder.append("\";");
}
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
return builder.toString();
}
2. 测试验证
2.1 test
@Test
public void singleTest() {
Bean beforeBean = new Bean(1L, "男", "小白");
Bean afterBean = new Bean(1L, "女", "张飞");
String msg = getSingleFields(beforeBean, afterBean);
System.out.println(msg);
}
2.2 运行结果:
修改性别"男"为"女";修改姓名"小白"为"张飞";