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;
        }
    }
  • 相关阅读:
    字符串个数的麻烦
    最长单调递增子序列LIS(《算法导论》15.4-5题)
    LCS问题
    关于nextLine()与nextInt()
    调用内部类里,在静态类中调用动态方法的问题
    RTL底层释放或回收对象
    软件需求分、架构设计与建模最佳实践
    Spring@Autowired java.lang.NullPointerException 空指针
    MAC下安装REDIS和REDIS可视化工具RDM并连接REDIS
    Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.catalina.connector.CoyoteWriter and no properties discovered to create BeanSerializer
  • 原文地址:https://www.cnblogs.com/wangquanyi/p/12106514.html
Copyright © 2011-2022 走看看