分享一下比较两个实体类的工具包

package cn.mollie.utils;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

import java.sql.Timestamp;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Date;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

public class CompareUtil {

    /**

     * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异

     * @param oldObject 进行属性比较的对象1

     * @param newObject 进行属性比较的对象2

     * @return 属性差异比较结果boolean

     */

    public static boolean compareObject(Object oldObject, Object newObject) {

        Map<String, List<Object>> resultMap=compareFields(oldObject,newObject,null);

        //System.out.println("resultMap------------"+resultMap);

        if(resultMap.size()>0) {

            return false;

        }else {

            return true;

        }

    }

    /**

     * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值

     * @param obj1 进行属性比较的对象1

     * @param obj2 进行属性比较的对象2

     * @param ignoreArr 忽略比较的字段

     * @return 属性差异比较结果map

     */

    @SuppressWarnings("rawtypes")

    public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {

        try{  

            Map<String, List<Object>> map = new HashMap<String, List<Object>>();  

            List<String> ignoreList = null;  

            if(ignoreArr != null && ignoreArr.length > 0){  

                // array转化为list  

                ignoreList = Arrays.asList(ignoreArr);  

            }  

            if (obj1.getClass() == obj2.getClass()) {// 只有两个对象都是同一类型的才有可比性  

                Class clazz = obj1.getClass();  

                // 获取object的属性描述  

                PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,  

                        Object.class).getPropertyDescriptors();  

                for (PropertyDescriptor pd : pds) {// 这里就是所有的属性了  

                    String name = pd.getName();// 属性名  

                    if(ignoreList != null && ignoreList.contains(name)){// 如果当前属性选择忽略比较,跳到下一次循环  

                        continue;  

                    }  

                    Method readMethod = pd.getReadMethod();// get方法  

                    // 在obj1上调用get方法等同于获得obj1的属性值  

                    Object o1 = readMethod.invoke(obj1);  

                    // 在obj2上调用get方法等同于获得obj2的属性值  

                    Object o2 = readMethod.invoke(obj2);  

                    if(o1 instanceof Timestamp){  

                        o1 = new Date(((Timestamp) o1).getTime());  

                    }  

                    if(o2 instanceof Timestamp){  

                        o2 = new Date(((Timestamp) o2).getTime());  

                    }  

                    if(o1 == null && o2 == null){  

                        continue;  

                    }else if(o1 == null && o2 != null){  

                        List<Object> list = new ArrayList<Object>();  

                        list.add(o1);  

                        list.add(o2);  

                        map.put(name, list);  

                        continue;  

                    }  

                    if (!o1.equals(o2)) {// 比较这两个值是否相等,不等就可以放入map了  

                        List<Object> list = new ArrayList<Object>();  

                        list.add(o1);  

                        list.add(o2);  

                        map.put(name, list);  

                    }  

                }  

            }  

            return map;  

        }catch(Exception e){  

            e.printStackTrace();  

            return null;  

        }  

    }

}

java怎么比较两个实体类的属性值的更多相关文章

  1. java反射获取和设置实体类的属性值 递归所有父类

    最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...

  2. java利用反射动态获取实体类的属性值

    直接贴代码吧,有需要的话,可以根据自己的需要修改部分代码: public BigDecimal getByAttributeName(ThmdGwqriR thmdGwqriR, String att ...

  3. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  4. java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  5. @Select 数据表的字段与实体类的属性值

    添加@Results @Select("select * from goods") @Results({ @Result(property = "id", co ...

  6. java中循环遍历实体类的属性和数据类型以及属性值

    package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTarg ...

  7. 【转】java遍历实体类的属性和数据类型以及属性值

    和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...

  8. java遍历实体类的属性和数据类型以及属性值

    遍历实体类的树形和数据类型一级属性值 /** * 遍历实体类的属性和数据类型以及属性值 * @param model * @throws NoSuchMethodException * @throws ...

  9. java中如何遍历实体类的属性和数据类型以及属性值

      package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTa ...

随机推荐

  1. hive 引入第三方包(不重启)

    Jar放入${HIVE_HOME}/auxlib目录 在${HIVE_HOME}中创建文件夹auxlib,然后将自定义jar文件放入该文件夹中. 此方法添加不需要重启Hive.而且比较便捷. 连接方式 ...

  2. (转) C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库

    原贴链接:https://www.cnblogs.com/mq0036/p/11052359.html C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracl ...

  3. js精度缺失问题

    /** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. ** 调用:accAdd(arg ...

  4. 第二周、ubuntu的简单介绍与使用

    一.复习第一周的大致内容:1.UNIX与Linux.ubuntu系统UNIX是1971年贝尔实验室的肯·汤普逊.丹尼斯·里奇,合作研发一款通过的操作系统,多用户.多任务.安全.稳定,收费.Linux是 ...

  5. 【LEETCODE】68、动态规划,medium级别,题目:95、120、91

    package y2019.Algorithm.dynamicprogramming.medium; /** * @ProjectName: cutter-point * @Package: y201 ...

  6. 打家劫舍II

    题目描述(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的 ...

  7. [SOJ #498]隔膜(2019-10-30考试)/[POJ2152]Fire

    题目大意:有一棵$n$个点的带边权树,第$i$个点有两个值$w_i,d_i$,表示在这个点做标记的代价为$w_i$,且这个点距离$d_i$以内至少要有一个点被标记,为最小代价.$n\leqslant6 ...

  8. 1、C#多线程基础理论

    系统为应用程序分配所需的内存以及其他资源,内存和资源的物理分离叫做进程.   进程是以线程为单位竞争CPU,那么什么是线程呢? 线程可看成一个可执行的指令单元,他使用进程中的数据,包含若干条指令,进程 ...

  9. sqoop从mysql导数据到hive报错:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    背景 使用sqoop从mysql导数据到hive,从本地服务器是可以访问mysql的(本地服务器是hadoop集群的一个datanode),但是sqoop导数据的时候依然连接不上mysql 报错如下: ...

  10. css3 media媒体查询器用法总结(附js兼容方法)

    css3 media媒体查询器用法总结 标签:class   代码   style   html   sp   src 随着响应式设计模型的诞生,Web网站又要发生翻天腹地的改革浪潮,可能有些人会觉得 ...