场景
项目中需要将后台更新操作记录到数据库中,并且需要详细记录哪个字段发生改变
思路
大概思路就是使用反射。先获取到更新前后的参数,以更新后参数为比较依据获取属性名,再分别获取更新前后的值进行比较
代码
//比较两个Object类型参数是否一致
public static String compareDiff(Object afterUpdateObject, Object beforeUpdateObject) {
StringBuilder modifyContent = new StringBuilder();
if (null == afterUpdateObject || null == beforeUpdateObject) {
return "";
}
Class<?> afterClass = afterUpdateObject.getClass();
Field[] fields = afterClass.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
//获取srcField值
String srcValue = getFieldValue(afterUpdateObject, fieldName) == null ? "" : getFieldValue(afterUpdateObject, fieldName).toString();
//获取对应的targetField值
String targetValue = getFieldValue(beforeUpdateObject, fieldName) == null ? "" : getFieldValue(beforeUpdateObject, fieldName).toString();
if (StringUtils.isEmpty(srcValue) && StringUtils.isEmpty(targetValue)) {
continue;
}
if (!srcValue.equals(targetValue)) {
modifyContent.append(fieldName).append("由'").append(targetValue).append("'修改为'").append(srcValue).append("';");
}
}
return !modifyContent.toString().equals("") ? modifyContent.toString() : "无更新参数";
}
private static Object getFieldValue(Object obj, String fieldName) {
Object fieldValue = null;
if (null == obj) {
return null;
}
String getMethod = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method[] methods = obj.getClass().getDeclaredMethods();
for (Method method : methods) {
String methodName = method.getName();
if (!getMethod.equals(methodName)) {
continue;
}
try {
fieldValue = method.invoke(obj);
} catch (Exception e) {
log.info("取值出错,方法名 " + methodName);
}
}
return fieldValue;
}