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;
        }
    }
  • 相关阅读:
    使用Jenkins自带功能(不用shell)构建Docker镜像并推送到远程仓库
    方法2:使用Jenkins构建Docker镜像 --SpringCloud
    在jenkins中使用shell命令推送当前主机上的docker镜像到远程的Harbor私有仓库
    解决跟Docker私有仓库登陆,推送,拉取镜像出现的报错
    Linux 内存占用大排查
    方法1:使用Jenkins构建Docker镜像 --SpringCloud
    使用Jenkins编译打包SpringCloud微服务中的个别目录
    使用Jenkins的Git Parameter插件来从远程仓库拉取指定目录的内容
    稀疏检出-使用git检索出仓库里的某一个目录文件,而不是整个仓库的所有文件
    通过 Kubeadm 安装 K8S 与高可用,版本1.13.4
  • 原文地址:https://www.cnblogs.com/wangquanyi/p/12106514.html
Copyright © 2011-2022 走看看