private static Logger logger= LoggerFactory.getLogger(ObjectFieldUtil.class);
/**
* 将旧对象的属性值与新对象的属性值做比较 记录修改的属性值名称
* @param oldObject 旧对象
* @param newObject 新对象
* @return 修改的对象属性值名称集合
*/
public static List<String> getChangeList(Object oldObject, Object newObject) {
//修改的对象属性值名称集合
List<String> changeList=new ArrayList<>();
//根据对象获取属性值名称
String[] filedNameArray=getFieldName(oldObject);
//对比两个对象属性值是否相等
for(int j=0 ; j<filedNameArray.length ; j++){ //遍历所有属性
String fieldName = filedNameArray[j]; //获取属性的名字
//忽略版本对比
if("serialVersionUID".equals(fieldName)){
continue;
}
Object valueOld = getFieldValueByName(fieldName,oldObject);//旧对象的值
Object valueNew = getFieldValueByName(fieldName,newObject);//新对象的值
if(valueOld == valueNew || valueOld.equals(valueNew)){
//属性值相同
}else{
//属性值不同 ,记录属性名称
changeList.add(fieldName);
}
}
return changeList;
}
/**
* 获取属性名数组
* */
private static String[] getFieldName(Object o){
Field[] fields=o.getClass().getDeclaredFields();
String[] fieldNames=new String[fields.length];
for(int i=0;i<fields.length;i++){
fieldNames[i]=fields[i].getName();
}
return fieldNames;
}
/**
* 根据属性名获取属性值
* @param fieldName 属性名称
* @param o 对象
* @return
*/
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
logger.error("根据属性名获取属性值异常:"+e.getMessage(),e);
return null;
}
}