ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

内容差异比较工具类

2022-07-25 14:33:41  阅读:165  来源: 互联网

标签:return 差异 v1 v2 内容 && import 工具 null


目录

内容差异比较工具类

比较两个对象是否存在差异

实际需求:

同步数据时,比较与数据库中的数据是否存在差异

内容差异比较器工具类

import lombok.extern.slf4j.Slf4j;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;

/**
 * 内容差异比较器
 *
 * @author lyn
 * @date 2022/7/25 11:30
 */
@Slf4j
public class ContextDifferenceUtil {

    /**
     * 比较两个对象是否存在差异
     *
     * @param oldObj
     * @param newObj
     * @param clazz
     * @return
     */
    public static boolean contrasObj(Object oldObj, Object newObj, Class clazz) {
        if (Objects.isNull(oldObj)) {
            return true;
        }
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            //对字段上有IgnoreField注解的忽略比较
            if (field.isAnnotationPresent(IgnoreField.class)) {
                continue;
            }
            try {
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = propertyDescriptor.getReadMethod();
                //取出新老字段的值去比较,
                Object v1 = getMethod.invoke(oldObj);
                Object v2 = getMethod.invoke(newObj);
                if (v1 != null && v2 != null && (!v1.toString().equals(v2.toString()))) {
                    return true;
                }
                // TODO: 2022/7/25 不完善 ,需根据实际情况修改
                //如果oldObj是数据库中查出的对象时,需要排除默认值的干扰
                if (v1 != null && (!"".equals(v1.toString())) && v2 == null) {
                    return true;
                }
                if (v1 == null && v2 != null && (!"".equals(v2.toString()))) {
                    return true;
                }
            } catch (Exception e) {
                log.error("ContextDifferenceUtil-error: "+e.getMessage());
            }
        }
        return false;
    }
}

忽略字段注解

/**
 * 忽略字段注解
 *
 * @author lyn
 * @date 2022/7/25 11:36
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreField {
}

异常问题解决

执行到这里时抛出异常:java.beans.IntrospectionException: Method not found: isSerialVersionUID

image-20220725142406697

解决方案:去掉该字段或者在该字段上加@IgnoreField(忽略字段注解)

image-20220725140414828

标签:return,差异,v1,v2,内容,&&,import,工具,null
来源: https://www.cnblogs.com/lyn8100/p/16517265.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有