您的位置 首页 java

java找出同一类型的不同对象的字段差异,并记录

 

import  java .lang.reflect.Field;
import java.util. HashMap ;
import java.util.Map;

import com.google.common.base.Objects;
/**
 * 找出 不同的字段内容
 * 
 */public class ChangeUtils {
   public  static  Map<String,String> bdNames = new HashMap<String,  String >();
   static {
      bdNames.put("name", "名称");
      bdNames.put("parent_id", "上级bdid");
      bdNames.put("mobile", "手机号");
      bdNames.put("limitNum", "关联客户上限");
      bdNames.put("cloudControlWhiteDesc", "可购买权限");
      bdNames.put("email", "邮箱");
      bdNames.put("cloudControlDesc", "权限");
      bdNames.put("bdBusinessTypeDesc", "业务标签");
      bdNames.put("salesTypeName", "职位");
      bdNames.put("whitelistLimitNum", "白名单上限");
      bdNames.put("bu", "bu");
      bdNames.put(" TypeName ", "一级类型");
      bdNames.put("secondTypeName", "二级类型");
   }
   
   public static String compare(Object co, Object mo , Map<String,String> bdNames) throws  Exception  {
       StringBuilder  sb = new StringBuilder();
      if (null == co || null == mo) {
         return sb.toString();
      }
      if (co.getClass() != mo.getClass()) {
         return sb.toString();
      }
      // 获取对象的class
      Class cc = co.getClass();
      Class mc = mo.getClass();
      // 获取声明的变量
      Field[] cfs = cc.getDeclaredFields();
      Field[] mfs = mc.getDeclaredFields();
      for (int i = 0; i < cfs.length; i++) {
         Field cfield = cfs[i];
         for (int j = 0; j < mfs.length; j++) {
            Field mfield = mfs[j];
            // 判断两个变量名是否一致
            if (cfield.getName().equals(mfield.getName())) {
               //获取变量名称
                    String fieldName = cfield.getName();
                    String fieldNameDesc = null;
                    if(bdNames.containsKey(fieldName) && bdNames.get(fieldName)!=null) {
                       fieldNameDesc = bdNames.get(fieldName);
                    }else {
                       break;
                    }
                    //组合变量的对应get方法 getId
                    String method = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1,fieldName.length());
                    //根据方法名称调用对象方法获取变量值
                    Object v1 = cc.getMethod(method).invoke(co);
                    Object v2 = mc.getMethod(method).invoke(mo);
                    
                    if(null == v1 && null == v2) {
                       break;
                    }
                    if(null != v1 && null == v2) {
                       break;
                    }
                    //判断变量值是否为空
                    if(null == v1 || null == v2 || !Objects.equal(v1, v2)){
                       sb.append(" (").append(fieldNameDesc).append(")").append("以前:").append(v1).append("-->").append("现在: ").append(v2).append("; ");
                       //System.out.println(method+"  v1:"+v1+"---"+"v2:"+v2);
                    }else {
                       break;
                    }
               // 判断变量是否有自定义注解
               /*boolean flag = cfield.is Annotation Present(Change.class);
               if(flag){
                   //获取对象的自定义注解内容
                  Change f = cfield.getAnnotation(Change.class);
                  //判断变量值是否相同
                   if (!v1.equals(v2)){
                      //拼接 字符串 ,如编号:1改为2,姓名:张三改为李四,
                      sb.append(f.fieldName()+getString(v1,f.pattern())+f.expand()+f.extra()+getString(v2,f.pattern())+f.expand()+f.separator());
                      break;
                  }
               }*/            }
         }
      }
      return sb.toString();
   }
}
  

日志记录使用:

 OperateLog recordLog = new OperateLog(user.getUsername(),new Date(),( byte ) 2);
recordLog.setType(OperateTypeEnum.FirstType.bd_manage.getType());
recordLog.setKeyWord(String.valueOf(bdInfoRZ.getId()));
recordLog.setContentPre(bdOld==null?"":bdOld.getRemarkLog());

//这里
recordLog.setContent(ChangeUtils.compare(bdOld, bdInfoRZ, ChangeUtils.bdNames));


recordLog.setBdIds(String.valueOf(bdInfoRZ.getId()));
operateLogService.insertSelective(recordLog);  

文章来源:智云一二三科技

文章标题:java找出同一类型的不同对象的字段差异,并记录

文章地址:https://www.zhihuclub.com/185946.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图