对象内容对比
日常开发中,经常涉及到操作日志的记录,将操作前后数据变化一一记录下来,这就涉及到2个新旧数据对象的对比。
设计思路
自定义注解,然后利用反射机制,找到对象中包含自定义注解的字段,获取其值,进行对比。
实现代码 v1.0(简单实现版)
1:自定义注解类,BeanDoc
/**
* 注释
* <li>用于字段</li>
* @author duanyong@jccfc.com
* @date 2020/11/9 20:11
*/
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanDoc {
String value() default "";
}
2:定义工具类,添加compareObject方法
/**
* 对象比较
* <li></li>
* @author duanyong@jccfc.com
* @date 2020/11/10 9:07
* @version 1.0
* @param oldBean:原始对象
* @param newBean:新对象
* @return: java.util.List<java.lang.String[]>[字段,字段描述,旧值,新值]
*/
public static List<String[]> compareObject(Object oldBean, Object newBean) {
List<String[]> results = new ArrayList<>(15);
try {
Class clazz = oldBean.getClass();
Field[] fields = oldBean.getClass().getDeclaredFields();
for (Field field : fields) {
if ("serialVersionUID".equals(field.getName())) {
continue;
}
BeanDoc beanDoc = field.getAnnotation(BeanDoc.class);
if(beanDoc == null){
continue;
}
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method getMethod = pd.getReadMethod();
Object v1 = getMethod.invoke(oldBean);
Object v2 = getMethod.invoke(newBean);
if (v1 == null && v2 == null) {
continue;
}
v1 = v1 == null ? new String() : v1;
v2 = v2 == null ? new String() : v2;
if (!v1.toString().equals(v2.toString())) {
String[] strArray = new String[4];
strArray[0] = field.getName();
strArray[1] = StringUtils.isBlank(beanDoc.value()) ? "" : beanDoc.value();
strArray[2] = v1.toString();
strArray[3] = v2.toString();
results.add(strArray);
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("对象比较失败:",e);
}
return results;
}
一些信息
路漫漫其修远兮,吾将上下而求索
码云:https://gitee.com/javacoo
QQ群:164863067
作者/微信:javacoo
邮箱:xihuady@126.com
网友评论