两个对象相同属性的值比较

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CompareField {

  public String value() default "";

}
  /**
   * 拥有自定义注解 @CompareField 的同名属性值对比,对比双方必须同时有注解
   *
   * @param oldObj 原obj
   * @param newObj 新obj
   * @return Map(Annotation - value, Map ( oldValue, newValue))
   * @throws Exception
   */
  public static Map<String, Map<String, String>> compare(Object oldObj, Object newObj)
      throws Exception {
    Map<String, Map<String, String>> map = new HashMap<>();
    Class<?> clazz1 = oldObj.getClass();
    Class<?> clazz2 = newObj.getClass();
    Field[] fields1 = clazz1.getDeclaredFields();
    Field[] fields2 = clazz2.getDeclaredFields();
    if (fields1.length <= 0 || fields2.length <= 0) {
      return null;
    }
    for (int i = 0; i < fields1.length; i++) {
      fields1[i].setAccessible(true);
      if (fields1[i].getAnnotation(CompareField.class) != null) {
        for (int j = 0; j < fields2.length; j++) {
          if (fields1[i].getName().equals(fields2[j].getName())) {
            fields2[j].setAccessible(true);
            Map<String, String> fieldMap = new HashMap<>();
            fieldMap.put(fields1[i].get(oldObj).toString(), fields2[j].get(newObj).toString());
            map.put(fields1[i].getAnnotation(CompareField.class).value(),
                fieldMap);
          }
        }
      }
    }
    return map;
  }

 主要使用自定义注解以及java反射机制,先获取object的所有field[]再通过注解筛选需要对比的值,得到想要的对比结果,基本功能够用了。

posted @ 2021-04-09 15:36  把泥洗干净  阅读(578)  评论(0)    收藏  举报