首页 > 编程语言 >Java比较两个实体属性值是否相同,将不同的属性输出

Java比较两个实体属性值是否相同,将不同的属性输出

时间:2023-05-25 18:03:37浏览次数:45  
标签:输出 Java map oldObject oldValue valueMap newValue 属性


/**
	 * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
	 * @param oldObject 进行属性比较的对象1
	 * @param newObject 进行属性比较的对象2
	 * @return 属性差异比较结果map
	 */
	@SuppressWarnings("rawtypes")
	public static Map<String, Map<String,Object>> compareFields(Object oldObject, Object newObject) {
		Map<String, Map<String, Object>> map = null;
		
		try{	
			/**
			 * 只有两个对象都是同一类型的才有可比性
			 */
			if (oldObject.getClass() == newObject.getClass()) {
				map = new HashMap<String, Map<String,Object>>();
				
				Class clazz = oldObject.getClass();
				//获取object的所有属性
				PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors();
				
				for (PropertyDescriptor pd : pds) {
					//遍历获取属性名
					String name = pd.getName();
					
					//获取属性的get方法
					Method readMethod = pd.getReadMethod();
					
					// 在oldObject上调用get方法等同于获得oldObject的属性值
					Object oldValue = readMethod.invoke(oldObject);
					// 在newObject上调用get方法等同于获得newObject的属性值
					Object newValue = readMethod.invoke(newObject);
					
					if(oldValue instanceof List){
						continue;
					}
					
					if(newValue instanceof List){
						continue;
					}
					
					if(oldValue instanceof Timestamp){
						oldValue = new Date(((Timestamp) oldValue).getTime());
					}
					
					if(newValue instanceof Timestamp){
						newValue = new Date(((Timestamp) newValue).getTime());
					}
					
					if(oldValue == null && newValue == null){
						continue;
					}else if(oldValue == null && newValue != null){
						Map<String,Object> valueMap = new HashMap<String,Object>();
							valueMap.put("oldValue",oldValue);
							valueMap.put("newValue",newValue);
						
						map.put(name, valueMap);
						
						continue;
					}
					
					if (!oldValue.equals(newValue)) {// 比较这两个值是否相等,不等就可以放入map了
						Map<String,Object> valueMap = new HashMap<String,Object>();
							valueMap.put("oldValue",oldValue);
							valueMap.put("newValue",newValue);
						
						map.put(name, valueMap);
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return map;
	}

如果只单纯判断两个对象是否相等那么使用equals就行了

标签:输出,Java,map,oldObject,oldValue,valueMap,newValue,属性
From: https://blog.51cto.com/chengzheng183/6350519

相关文章

  • JAVA List和Map切割方法
    importorg.springframework.util.CollectionUtils;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;publicclassCollectionUtil{/***将map切成段,作......
  • java两个对象属性比较
    两个对象进行比较相等,有两种做法:1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可。这里就不用说明2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射,具体代码如下:publicstaticvoidmain(String[]args){Aa=newA();a.setUserName(......
  • IDEA下查看Java字节码(插件ByteCode Viewer)
    安装jclasslibbytecodeviewer插件 使用结果......
  • jenkins--构建传输jar包后启动java服务
    jenkins--构建传输jar包后启动java服务目标:针对单体java服务前置条件:jdk1.8日志切割cronologjdk1.8安装cronolog安装创建server.sh脚本文件#!/bin/bashJAR_PATH="/data/forwarder"#文件目录JAR_FILE="ruoyi-admin.jar"#文件名LOG_PATH="/data/forwarder/logs"#cro......
  • [Javascript] Generator with example - 1
    Differencebetween yieldand returnreturnset donetotrue/***Example1*/function*loggerator(){console.log("running");yield"paused";console.log("runningagain");return"stopped";}letlogger=......
  • Hello World II - python垂直输出Hello World
    描述垂直输出"HelloWorld",全部代码不超过2行。 输入无输出Hello Worldstr="HelloWorld"fornameinstr[:]:print(name)修改:开始没看到要求不超过两行,正确代码为:fornamein"HelloWorld":print(name)题目来源:python123.io......
  • Java的访问控制修饰符
    为什么使用访问控制修饰符使用访问控制修饰符,主要是为了实现信息的隐藏,在编写程序时,有些核心数据往往不希望被用户调用,需要控制这些数据的访问。对类成员访问的限制,有利于防止对象的误用。只允许通过一系列定义完善的方法来访问私有数据,就可以(通过执行范围检查)防止数据赋予不正......
  • java removeAll 返回2个数组的差集
    注意:removeAll不是差集importjava.util.ArrayList;publicclassImoocStudent{publicstaticvoidmain(Stringargs[]){ArrayList<String>objArray=newArrayList<String>();ArrayList<String>objArray2=newArrayList......
  • Netbeans开发—JAVA 作业之求素数
        JAVA课上的一个作业:求比给定的数小的所有素数并打印出来    准备工作:    1)用Netbeans新建一个JavaApplication     2)创建文件目录(根据个人习惯创建文件目录),我的目录如下:        3)创建本工程的JAVA文件:Prime.java              ......
  • javascript prototype and class
    js中的prototype绝对是js的一个重要知识点,有点像delegate的模式,和oop对象形式还是有些差别的,尽管可以做同样的事情。简要学习可以参见:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes关于js的class和java的语法很像,参见:https://develope......