package com.moral.api.util;
|
|
import com.moral.anno.FieldName;
|
import com.moral.pojo.CompareFieldResult;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.beans.IntrospectionException;
|
import java.beans.PropertyDescriptor;
|
import java.lang.reflect.Field;
|
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.Method;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* @ClassName ComparePropertyUtils
|
* @Description TODO
|
* @Author 陈凯裕
|
* @Date 2021/8/24 13:34
|
* @Version TODO
|
**/
|
@Slf4j
|
public class CompareFieldUtils {
|
|
/**
|
* @Description: 对比两个对象之间属性的区别
|
* @Param: [t, oldObject, newObject]
|
* @return: java.util.List<com.moral.pojo.CompareFieldResult>
|
* @Author: 陈凯裕
|
* @Date: 2021/8/24
|
*/
|
public static <T> List<CompareFieldResult> compare(T t, Object oldObject, Object newObject) {
|
List<CompareFieldResult> results = new ArrayList<>();
|
try {
|
T oldObj = (T) oldObject;
|
T newObj = (T) newObject;
|
//获取class对象
|
Class<?> TClass = oldObject.getClass();
|
//获取类的属性
|
Field[] fields = TClass.getDeclaredFields();
|
for (Field field : fields) {
|
//过滤序列化信息Id
|
if ("serialVersionUID".equals(field.getName())) {
|
continue;
|
}
|
//如果没有fieldName注解则跳过
|
FieldName annotation = field.getAnnotation(FieldName.class);
|
if(annotation==null)
|
continue;
|
//创建属性扫描器
|
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), TClass);
|
//获取该属性的get方法
|
Method readMethod = pd.getReadMethod();
|
//读取对象该属性的值
|
Object oldDataObj = readMethod.invoke(oldObj);
|
Object newDataObj = readMethod.invoke(newObj);
|
//如果新的值为null则证明该属性没有更新
|
if(newDataObj==null)
|
continue;
|
//如果旧值和新值相等则证明没有改变
|
if(oldDataObj!=null&&oldDataObj.toString().equals(newDataObj.toString()))
|
continue;
|
//创建返回对象
|
CompareFieldResult result = new CompareFieldResult();
|
result.setFieldName(field.getName());
|
result.setFieldAnnoName(annotation.value());
|
|
if(newDataObj.equals(""))
|
result.setNewData("null");
|
else
|
result.setNewData(newDataObj.toString());
|
|
if(oldDataObj==null||oldDataObj.equals(""))
|
result.setOldData("null");
|
else
|
result.setOldData(oldDataObj.toString());
|
|
results.add(result);
|
}
|
}catch (IntrospectionException e) {
|
log.error(e.getMessage());
|
} catch (IllegalAccessException e) {
|
log.error(e.getMessage());
|
} catch (InvocationTargetException e) {
|
log.error(e.getMessage());
|
}
|
return results;
|
}
|
|
/**
|
* @Description: 将对比结果类转换为content
|
* @Param: [results, content] content参数需要传入修改的基本描述。比如,修改了前台菜单,修改了后台角色
|
* @return: java.lang.String
|
* @Author: 陈凯裕
|
* @Date: 2021/8/24
|
*/
|
public static String resultsConvertContent(List<CompareFieldResult> results,String content){
|
StringBuilder contentReulst = new StringBuilder(content+";");
|
for (CompareFieldResult result : results) {
|
contentReulst.append(result.getFieldAnnoName()+":"+result.getOldData()+"->"+result.getNewData()+";");
|
}
|
return contentReulst.toString();
|
}
|
}
|