java比较两个相同对象的属性是否一致

来源:互联网 发布:西安交通大学软件学院 编辑:程序博客网 时间:2024/04/19 19:26

主类

import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class CompareObejct<T> {private CompareStatus status;/** * 之前原始的值 */private T original;/** * 当前的值 */private T current;public CompareStatus getStatus() {return status;}public T getOriginal() {return original;}public void setOriginal(T original) {this.original = original;}public T getCurrent() {return current;}public void setCurrent(T current) {this.current = current;}public void contrastObj(Class<T> cls) {if(this.original==null){this.status=CompareStatus.NEW;return;}if(this.status==CompareStatus.REMOVE){return;}        boolean isEqual=true;         try {              //Class clazz = this.original.getClass();            Field[] fields = cls.getDeclaredFields();              for (Field field : fields) {                  PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cls);                  Method getMethod = pd.getReadMethod();                  Object o1 = getMethod.invoke(this.original);                  Object o2 = getMethod.invoke(this.current);                  String s1 = o1 == null ? "" : o1.toString();//避免空指针异常                  String s2 = o2 == null ? "" : o2.toString();//避免空指针异常                  //思考下面注释的这一行:会bug的,虽然被try catch了,程序没报错,但是结果不是我们想要的                  //if (!o1.toString().equals(o2.toString())) {                  if (!s1.equals(s2)) {                      //textList.add("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");                isEqual=false;                System.out.println("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");                 }              }          } catch (Exception e) {              System.out.println(e.getMessage());          }        if(isEqual){        this.status=CompareStatus.NO_CHANGE;        }else{        this.status=CompareStatus.CHANGE;        }    }}
枚举

public enum CompareStatus {/** * 标记新数据 */NEW,/** * 标记变更数据 */CHANGE,/** * 标记没有变更 */NO_CHANGE,/** * 标记移除数据 */REMOVE}

测试

public class CompareTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubBDCommend obj1 = new BDCommend();obj1.setBzjlbh("1111");obj1.setHjrq(new Date());BDCommend obj2 = new BDCommend();obj2.setBzjlbh("1112");obj2.setHjrq(new Date());CompareObejct compare = new CompareObejct();compare.setCurrent(obj1);compare.setOriginal(obj2);compare.contrastObj(BDCommend.class);System.out.println(compare.getStatus());}}



原创粉丝点击