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

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. elk配置路径

    elk/usr/local/etc/elasticsearch-6.5.1/usr/local/Cellar/logstash/6.5.1/./logstash -f/usr/local/Cellar ...

  2. Java并发编程核心概念一览

    作者博客地址 https://muggle.javaboy.org. 并行相关概念 同步和异步 同步和异步通常来形容一次方法的调用.同步方法一旦开始,调用者必须等到方法结束才能执行后续动作:异步方法则 ...

  3. perl修改镜像源地址

    perl修改源地址 这里推荐中科大的源 http://mirrors.ustc.edu.cn/CPAN/ perl -MCPAN -e shell 1.执行cpan命令确认存在该命令 如果cpan执行 ...

  4. 翻书shader

    //把下面的shader挂载到plane上,调节_Angle Shader "Unlit/PageTurning"{ Properties { _Color ("Colo ...

  5. Ubuntu 定时关机

    sudo shutdown +120 Shutdown scheduled for Sat 2019-09-21 23:48:44 CST, use 'shutdown -c' to cancel.

  6. go switch 和java C#有不同

    1 switch 后的语句可以有简单的赋值语句 2 case :后的语句结束后不需要break;默认自动结束 除非以 fallthrough 语句结束,否则分支会自动终止 没有条件的 switch 有 ...

  7. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens

    请求的协议不对  解决方案: 把请求的https改成http 

  8. Tcl语言学习--基础知识

    一.脚本.命令和单词符号 一个TCL脚本可以包含一个或多个命令.命令之间必须用换行符或分号隔开. 1.关键字/变量 变量是程序的基础变量组成:变量名.变量值变量名要求:任何字符串都可以作为变量名,区分 ...

  9. GitLab+Jenkins持续集成

    一.概述 GitLab是一个代码仓库,用来管理代码.Jenkins是一个自动化服务器,可以运行各种自动化构建.测试或部署任务.所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins ...

  10. Robot Arms AtCoder - 4432 (构造)

    大意: 给定平面上$n$个点$(x_i,y_i)$. 要求构造一个序列$d$, $d_i$表示每步走的距离, 再构造$n$个命令串, 要求从原点出发按照第$i$个命令走, 走完恰好到达$(x_i,y_ ...