没有唠叨。
最近项目中遇到了一个需求:
当某个对象的任何一个属性被修改后,就将这次操作修改前和修改后的值,都记录到操作表中。
无论是哪个对象中的某一个值得到修改后,都要有所记录。
比如:
修改前:
{realName : "晨翔66" , age : "21", birthday : "2000-06-12"}
修改后:
{realName : "晨翔啊" , age : "21", birthday : "2002-05-21"}
部分代码解释:
getDeclaredFields();
用来获取该对象中的所有属性值,包括public、protected、private、default中的字段,但不包括继承字段;
field.setAccessible(true);
// 开启检查是否有权限访问私有变量,如果为false,则不能访问 // 当我们设置的成员变量是私有的,必须要设置为true,否则将不能访问私有的静态变量 // 静态是因为给了序列化静态 Class demo.ClassTest can not access a member of class com.ycx.common.model.user.User with modifiers "private static final"
getName();用来获取字段名称field.getAnnotation(ApiModelProperty.class).value();// 获取字段名称上的简要描述
@ApiModelProperty(value = "真实姓名") private String realName;
代码:
@Test
public void testUser() throws IllegalAccessException {
User updateBefore =
userDao.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUid, 214));
User updateAfter = new User();
BeanUtils.copyProperties(updateBefore, updateAfter);
// 修改原来的数据
updateAfter.setRealName("晨翔啊~");
updateAfter.setBirthday("2001-06-12");
Field[] fields = User.class.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Object before = Optional.ofNullable(field.get(updateBefore)).orElse("");
Object after = Optional.ofNullable(field.get(updateAfter)).orElse("");
List<Object> list = new ArrayList<>();
if (!before.equals(after)) {
JSONObject object = new JSONObject();
object.put("field", field.getName());// 字段名称
object.put("fieldRemark",
field.getAnnotation(ApiModelProperty.class).value());
object.put("before", before);
object.put("after", after);
list.add(object);
}
}
}
User对象修改前后的记录:
field ---> 字段名称
before ---> 查出来的原数据
fieldRemark ---> 字段名称的简要描述
after ---> 修改后的值
[
[{
"field": "realName",
"before": "612晨翔",
"fieldRemark": "真实姓名",
"after": "晨翔啊"
}],
[{
"field": "birthday",
"before": "1999-06-12",
"fieldRemark": "生日",
"after": "2001-06-12"
}]
]