美文网首页
对象内容对比

对象内容对比

作者: javacoo | 来源:发表于2020-12-24 17:27 被阅读0次

    对象内容对比

    日常开发中,经常涉及到操作日志的记录,将操作前后数据变化一一记录下来,这就涉及到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
    

    相关文章

      网友评论

          本文标题:对象内容对比

          本文链接:https://www.haomeiwen.com/subject/iynmnktx.html