| 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(); | 
|     } | 
| } |