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

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. 使用Docker Compose搭建Service Mesh

    使用Docker Compose搭建Service Mesh 本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于 ...

  2. activiti学习3:流程引擎对象和流程引擎配置对象

    目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...

  3. Linux 下面 oracle 数据库连接工具的安装还有特殊字符密码登录的设置

    1. 下载Oracle的连接客户端 https://www.oracle.com/database/technologies/instant-client/downloads.html 2. 我这里仅 ...

  4. redis单机多节点集群

    # ##安装Redis redis安装参考 https://www.cnblogs.com/renxixao/p/11442770.html Reids安装包里有个集群工具,要复制到/usr/loca ...

  5. OpenLayers加载百度离线瓦片地图(完美无偏移)

    本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer完美无偏移加载百度离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/ope ...

  6. Go基础编程实践(二)—— 类型转换

    bool to string strconv包的FormatBool函数用于将bool转为string package main import ( "fmt" "strc ...

  7. Vivado关联Notepad++

    Vivado自带的编辑器非常难看,我习惯用Notepad++,这里记录一下二者的关联. 1.打开Vivado,点击 Tools --- Settings --- Text Editor,右侧选择 Cu ...

  8. 【EBS】取数SQL-平均成本更新的物料事务处理追溯到应付发票

    SELECT hou.name,--组织 aia.invoice_num,--发票编号 msib.segment1,--物料编码 mmt.transaction_id--物料事务处理 FROM mtl ...

  9. 引用和自包含令牌(Reference Tokens and Introspection)

    访问令牌可以有两种形式:自包含的和引用的. 自包含令牌(Self-contained tokens): 使用受保护的.有时间限制的数据结构,该结构包含元数据,并声明通过网络传递用户或客户机的身份.一种 ...

  10. C# vb .net实现透视图效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的透视图效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...