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

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. [LeetCode] 737. Sentence Similarity II 句子相似度 II

    Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...

  2. SpringBoot小技巧:统一异常处理

    SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...

  3. Arch Linux 启用 MTU 探测

    最近在家里经常遇到 ssh 超时的问题,一开始也没太当回事,感觉是网络不稳定导致的,但是后来慢慢的发现这种超时问题只会出现在跟 ssh 相关的程序中,例如 git.ssh.这成功的引起了我的注意,于是 ...

  4. Docker 两键创建 ZeroTier moon 节点

    一条命令创建 ZeroTier moon 节点: $ docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp seedgou/ ...

  5. php imagick添加文字和图片的方法

    Imagick添加文字和图片的方法<pre><?php $image = new Imagick(); $image->readImage("/home/www/wo ...

  6. SQL Server 2008新增的审核/审计功能(Audit)

    很多时候我们都需要对数据库或者数据库服务器实例进行审核/审计 例如对失败的登录次数进行审计,某个数据库上的DDL语句进行审计,某个数据库表里面的delete语句进行审计 事实上,我们这些审计的需求基本 ...

  7. ACM算法锦集

    一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...

  8. spring整合mybatis报.UnsatisfiedDependencyException错误

    tomcat启动报org.springframework.beans.factory.UnsatisfiedDependencyException:错误 org.springframework.bea ...

  9. Android Studio中设置与Eclipse中 Ctrl+1 功能类似的快捷键

    Eclipse:Ctrl + 1 Android Studio: Alt + Enter 1. 首先当然是打开设置窗口啦,然后在IDE Settings 下找到Keymap 2. 在Keymap的搜索 ...

  10. 创建包含CRUD操作的Web API接口5:实现Delete方法

    本节是前面四节的延续,在前面几节中我们创建了Web API并添加了必要的基础设施,实现了Get.Post.和Put方法.本节中,我们将介绍如何在Web API中实现Delete方法. 在RESTful ...