java反射机制比较同类对象的不同字段

最近在做一个项目中需要实现一个产品的升级中的变更记录查看,写了一个反射方法来记录对象中不同的字段内容,记录下来以备后来参考。

public List<ChangeInfo>compareDetails(Object obj){
       //存放新旧对象改变的内容 
       List<ChangeInfo> list = new ArrayList<ChangeInfo>();
       //新的对象
        Object newVersion = obj;
       //旧的对象
        Object oldVersion = XXXService.get(newVersion.getLastVersionId());
        //需要比较的字段
        String[]opDiffNameArray={"XX编码","XX名称","XX要求","XX目的","XX范围","XX使用前","XX使用过程中","XX使用过程后","XX注意事项"};
        //对应的类中的成员变量
        String[]opDiffArray={"code","name","requirement","purpose","range","beforeUse","inUse","afterUse","notice"};
        contrastObj(newVersion, oldVersion, opDiffArray, opDiffNameArray, list);
        return list;
    }
public void contrastObj(Object pojo1, Object pojo2, String[] diffMemberArray, String[] diffMemberName, List<ChangeInfo> diffList) {
       Map<String, Object> diffMap = new HashMap<String, Object>();
       //map存储中英文对应
       for (int i = 0; i < diffMemberArray.length; i++) {
           diffMap.put(diffMemberArray[i], diffMemberName[i]);
       }
      //英文List
       List<String> diffMember = Arrays.asList(diffMemberArray);
       try {
           Class clazz = pojo1.getClass();
           //获取obj1的所有字段
           Field[] fields = pojo1.getClass().getDeclaredFields();
           //遍历obj1所有字段
           for (Field field : fields) {
           //如果该字段不再Map中遍历下一个字段
               if (!diffMember.contains(field.getName())) {
                   continue;
               }
            //利用反射获取对应字段的get,set方法
               PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);            //获取get方法
               Method getMethod = pd.getReadMethod();
               Object o1 = null;
               Object o2 = null;
               if (pojo1 != null) {
            //调用obj1的对应字段的get方法
                   o1 = getMethod.invoke(pojo1);
               }
               if (pojo2 != null) {
             //调用obj2的对应字段的get方法
                   o2 = getMethod.invoke(pojo2);
               }
               String str1 = "";
               String str2 = "";
             //如果对象是日期类型格式化
               if (o1 instanceof Date) {
                   str1 = new SimpleDateFormat("yyyy-MM-dd").format(o1);
                   str2 = new SimpleDateFormat("yyyy-MM-dd").format(o2);
               } else if (o1 instanceof String) {
                   str1 = (String) o1;
                   str2 = (String) o2;
               } else {
                   continue;
               }
               //判断返回的对象不相等
               if ((str1 != null && !str1.equals(str2)) || (str2 != null && !str2.equals(str1))) {
                   ChangeInfo change = new ChangeInfo();
                   //字段英文名称
                   change.setTitle(field.getName());
                  //中文名称
                   change.setName((String) diffMap.get(field.getName()));
                  //旧信息
                   change.setOldInfo(str2);
                  //新信息
                   change.setNewInfo(str1);
                   diffList.add(change);
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
//存放不同信息的类
public class ChangeInfo extends DataEntity<ChangeInfo> {
   
   private static final long serialVersionUID = 1L;
   
   private String title;               // 改变标题 (变量名)
   private String name;                // 变更项的名称 (中文名)
   private String type;                // 变更显示类型(1:显示content内容 2: 显示前后(oldInfo,newInfo)变更信息)
   private String content;             // 提示内容
   private String oldInfo;             // 之前内容
   private String newInfo;             // 之后内容
  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值