在java中,两个相同结构的实体,我们想记录他每次修改后有哪些字段变化了,可以使用以下工具类来进行新旧实体的比较。调用compare方法时,传入的compareFields是自己定义的一个map,用于制定这个实体里面有哪些属性是需要进行比对的;而传入的transRule则是用于存放转换规则的map,主要用于一些存放字典值的属性,例如下面示例中的identityId属性,其中2代表求职者,3代表企业用户,而我们在比对的时候需要将字典值翻译成中文,所以需要传入这个map到transRule里面。如果有多个需要翻译的属性,则传入多个翻译规则的map就可以。
main方法的输出结果如下:比对结果:账号:由'zhangsan'更改为'lsi',姓名:由'张三'更改为'李四',手机号码:由'15627288888'更改为'15633322110',人员身份:由'求职者'更改为'企业用户'
package org.wtframework.rcsc.util;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.wtframework.platform.server.model.impl.User;
public class CompareObjectFields {
/**
* @Description: TODO 根据比较字段和比较规则来比较旧数据和新数据的改变之处并拼接成字符串
* @author: zgx
* @date: 2023年4月18日 上午10:38:57
* @param: compareFields 要比较的属性及其对应的中文名称
* @param: transRule 要比较的属性及其不同字典值对应的翻译
* @param: oldData 要比较的旧数据
* @param: newData 要比较的新数据
* @return: String
*/
public static String compare(Map<String, String> compareFields,Map<String, Map<String,String>> transRule,Object oldData,Object newData){
int count = 0;
StringBuilder sb = new StringBuilder();
for (Field declaredField : oldData.getClass().getDeclaredFields()) {
try {
String declaredFieldName = declaredField.getName();
if (compareFields.containsKey(declaredFieldName)) {
declaredField.setAccessible(true);
Object oldObj = declaredField.get(oldData);
Object newObj = declaredField.get(newData);
if (Objects.nonNull(oldObj) && !oldObj.equals(newObj)) {
if (count > 0) {
sb.append(",");
}
sb.append(compareFields.get(declaredFieldName));
sb.append(":由'");
if(transRule.containsKey(declaredFieldName)){
Map<String,String> rule = transRule.get(declaredFieldName);
sb.append(rule.get(oldObj.toString()));
sb.append("'更改为'");
sb.append(rule.get(newObj.toString()));
}else{
sb.append(oldObj.toString());
sb.append("'更改为'");
sb.append(newObj.toString());
}
sb.append("'");
count++;
}
}
} catch (IllegalAccessException e) {
System.out.println("错误:"+e.toString());
}
}
System.out.println("比对结果:" + sb.toString());
return sb.toString();
}
// 调用compare方法时可参考以下例子
public static void main(String[] args) throws IOException {
User oldData = new User();
oldData.setUsername("zhangsan");
oldData.setNickname("张三");
oldData.setPhoneNumber("15627288888");
oldData.setIdentityId(2);
User newData = new User();
newData.setUsername("lsi");
newData.setNickname("李四");
newData.setPhoneNumber("15633322110");
newData.setIdentityId(3);
//指定要比较的属性及其对应的中文名称
Map<String, String> compareFields = new HashMap<String, String>() {
{
put("username", "账号");
put("nickname", "姓名");
put("phoneNumber", "手机号码");
put("identityId", "人员身份");
}
};
//指定要比较的属性及其不同字典值对应的翻译
Map<String, Map<String,String>> transRule = new HashMap<String, Map<String,String>>();
Map<String,String> identityRule = new HashMap<String, String>(){{
put("2","求职者");
put("3","企业用户");
}};
transRule.put("identityId", identityRule);
compare(compareFields, transRule, oldData, newData);
}
}