Java比较两个实体类字段数值改变

package com.sojson.common.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.List;
import java.util.Map;

public class GetChangeDateUtil {
	/**
	 * 
	
	 * <p>Title: compareFields</p>  
	
	 * <p>Description: </p>  
					比较两个实体属性值
	 * @param obj1
	 * @param obj2
	 * @param ignoreArr 忽略的字段
	 * @return  
	 */
	 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;  
	        }  
	    }  
}

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值