分享一个实体类之间属性对比的方法

方法用途:对实体类的属性进行修改操作;如果当前修改操作与原先的实体类属性值一样则返回为true,无需进行修改操作;反之则进行修改操作;

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;

import org.junit.Test;

import com.datacode.bean.standardtitle.StandardTitle;

public class CompareUtil {

/**

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

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

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

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

*/

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

Map> resultMap=compareFields(oldObject,newObject,null);

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

if(resultMap.size()>0) {

return false;

}else {

return true;

}

}

@Test

public void test01() {

StandardTitle st1 = new StandardTitle();

st1.setStandardchinesename("123456");

st1.setStandardchronology("2");

StandardTitle st2 = new StandardTitle();

st2.setStandardchinesename("123456");

st2.setStandardchronology("2");

System.out.println(compareObject(st1, st2));

}

/**

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

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

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

* @param ignoreArr 忽略比较的字段

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

*/

@SuppressWarnings("rawtypes")

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

try{

Map> map = new HashMap>();

List 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 list = new ArrayList();

list.add(o1);

list.add(o2);

map.put(name, list);

continue;

}

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

List list = new ArrayList();

list.add(o1);

list.add(o2);

map.put(name, list);

}

}

}

return map;

}catch(Exception e){

e.printStackTrace();

return null;

}

}

}

实体类属性相同则返回位true

实体类其中某些属性不同则返回为false

java实体类属性比较_实体类之间属性对比的方法相关推荐

  1. java 实体建表 注释_实体bean,entity 注解设置

    持久化是位于JDBC之上的一个更高层抽象.持久层将对象映射到数据库,以便在查询.装载.更新或删除对象的时候,无须使用像JDBC那样繁琐的API.EJB的早期版本中,持久化是EJB平台的一部分.EJB3 ...

  2. java派生类属例子_“派生”类属与“相关”类属的辨析

    在奥苏贝尔有意义学习理论中下位学习又称类属学习,是指将概括程度或包容范围较低的新概念或命题,归属于认知结构中概括程度或包容范围较高的适当观念中,从而获得新概念或新命题的意义的学习.它可分为两种形式的学 ...

  3. python类实例覆盖_避免类实例覆盖默认值

    我正在处理初始化类的问题.下面是一个复制的例子,突出了潜在的问题(我没有设法使它小得多): 课程 我们有两个类A,B.等级制度A:第一类实例有两个属性link;name ^{cd2>的一个属性是 ...

  4. 80070583类不存在_原创 | 类应该是匀称和均匀的

    当我们采用面向对象的编程语言来设计类的时候,我们设计的大部分类应该是匀称并且均匀的. 类本身应该是匀称的 我们知道,类既有状态,又有行为.在多数面向对象的语言中,状态由类的字段来承载,而行为通过类的方 ...

  5. a标签download属性无效_使用这些 CSS 属性选择器来提高前端开发效率

    如题.但是不要担心,虽然属性选择器非常复杂和强大,但是它们很容易学习和使用.在本文中,我们将讨论它们是如何运行的,并给出一些如何使用它们的想法.通常将 HTML属性放在方括号中,称为属性选择器,如下: ...

  6. java mvc页面传值方式_详解SpringMVC的ModelAndView传值方法

    SpringMVC的ModelAndView传值方法 SpringMVC提供的ModelAndView可以很方便的将后台的值传到前台,前台页面直接使用EL表达式进行获取,获取方式: 1. @Reque ...

  7. java面向对象高级分层实例_实体类

    package bdqn.studentSys.entity; /*** 学生实体类* @author Administrator**/ public class Student {private S ...

  8. java 数字转化为汉字_工具类_java 数字转化为汉字大写

    public class Num2Rmb { private String[] hanArr = { "零", "壹", "贰", &quo ...

  9. java构造反射和函数_反射类的构造函数和方法

    开始学习Javaweb,看到了反射,现在还没有用上,先把基础的写上来吧 package com.april.write; public class Grade { private int num; p ...

  10. java面向对象高级分层实例_接口类

    package bdqn.studentSys.Dao;import java.util.List;import bdqn.studentSys.entity.Student;/*** 学生表的接口* ...

最新文章

  1. 万字深度好文!视觉-语言(VL)智能:任务、表征学习和大型模型
  2. html缩进快捷键_HTML 入门笔记
  3. LeetCode OJ - Populating Next Right Pointers in Each Node II
  4. sending data mysql slow Mysql查询非常慢的可能原因
  5. cfree运行程序错误的原因_Python入门教程 | 第 8 章 错误、调试和测试
  6. 清华图书馆机器人小图_机器人“小图”带你逛“国家图书馆110周年公共数字文化展”...
  7. mysql 唯一 标识符_mysql – 获取唯一标识符而不插入
  8. 【work】输出日期为那一年的第几天
  9. 阶段3 1.Mybatis_11.Mybatis的缓存_4 mybatis一对多实现延迟加载
  10. java equals() output_Java中的==和equals
  11. html实例,实现表单
  12. 是时候复习下 Webpack 了
  13. 代写品牌故事怎么写才能打动消费者
  14. 扇贝单词里有计算机英语吗,扇贝单词记录
  15. 微软android桌面壁纸,微软桌面(com.microsoft.launcher) - 6.210402.0.960830 - 应用 - 酷安
  16. Microsoft Access 数据库和表
  17. Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
  18. Html画组织架构图
  19. HTML按钮样式,CSS精美按钮
  20. Android 音频源码分析——音量调节流程

热门文章

  1. [Django学习] Django基础(8)_富文本编辑器
  2. WPF:MVVM模式下ViewModel关闭View
  3. SharePoint 2013 Error - File names can't contain the following characters: ? # {} % ~ / \.
  4. SQLite介绍及使用
  5. android rfid 数据解析_基于RFID技术的标签数据完整性与安全性解析
  6. Spring Boot入门(4)-事务管理
  7. 计算机将在1分钟重启,Win10开机经常提示将在一分钟后自动重启如何处理
  8. 云服务器怎么多人进去编辑文档,服务器如何设置多人登陆
  9. 联想万全服务器告警信息在哪里看,华为网络设备查看告警信息
  10. 又是整数划分(poj1032)