zoukankan      html  css  js  c++  java
  • 比较两个实体类是否一致utils

    比较两个实体类是否一致utils:

    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    import java.sql.Timestamp;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class ClassCompareUtil {
    
        
        /**
         * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
         * @param oldObject 进行属性比较的对象1
         * @param newObject 进行属性比较的对象2
         * @return 属性差异比较结果boolean
         */
        public static boolean compareObject(Object oldObject, Object newObject) {
            Map<String, Map<String,Object>> resultMap=compareFields(oldObject,newObject);
            
            if(resultMap.size()>0) {
                return true;
            }else {
                return false;
            }
        }
        
        /**
         * 比较两个实体属性值,返回一个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;
                        }
                        // 比较这两个值是否相等,不等就可以放入map了
                        if (!oldValue.equals(newValue)) {
                            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;
        }
    }
  • 相关阅读:
    Visual C++6.0 调用Visual Basic 6.0写的Microsoft Communications Control(ActiveX)的使用疑难及解决办法
    Associating Icons with a Category 与 恶作剧软件 有关系吗?
    WPF/Silverlight Button Styles and Templates
    Notepad++ 备忘录一
    冥思苦想,木疙瘩也能崩出个豆:扯一下各大软件的用户体验
    生活小窍门。
    Bug验证:.Net 4 下,貌似发现一个bug。如果是真,.Net组的员工该打屁股。
    两台硬件和软件配置完全相同的机器A和B,现在要用系统自带的Copy功能把A上的一个文件,复制到B上。在哪台机器上执行程序,效率更高?
    WPF 遍历 DataGrid 每行的控件
    IE ActiveX Control 和RIA
  • 原文地址:https://www.cnblogs.com/wangquanyi/p/12106514.html
Copyright © 2011-2022 走看看