java 對比兩個實體類字段變化(學(xué)習(xí)記錄)

對比實現(xiàn)

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 實體對比
 */
public class ComparedEntityUtil {
    public static void main(String[] args) {
        UserEntity u1=new UserEntity();
        u1.setName("李師1");
        u1.setAge(0);

        UserEntity u2=new UserEntity();
        u2.setName("李師");
        u2.setAge(0);

        System.out.println( compareTwoObject(u1,u2).toString());
    }

    /**
     *  對比兩個對象修改值 (字段只支持字符串、數(shù)值)
     * @param oldObject
     * @param newObject
     * @return
     */
    public static Object compareTwoObject(Object oldObject,Object newObject) {
        List<ComparedResult> ret=new ArrayList<>();
        Class clazz =oldObject.getClass();

        try {
            // 獲取所有字段
            Field[] Fields = clazz.getDeclaredFields();
            for (Field field : Fields) {
                String fieldName=field.getName();// 字段名
                FieldAnon fieldAnon =field.getAnnotation(FieldAnon.class);
                String filedAnoName="";
                if(null!= fieldAnon){
                    filedAnoName= fieldAnon.name(); // 字段中文名稱
                }


                PropertyDescriptor pd=new PropertyDescriptor(field.getName(),clazz);
                Method getMethod=pd.getReadMethod();

                // 在oldObject上調(diào)用get方法等同于獲得oldObject的屬性值
                Object oldValue = getMethod.invoke(oldObject);
                // 在newObject上調(diào)用get方法等同于獲得newObject的屬性值
                Object newValue = getMethod.invoke(newObject);

                // 對比兩個值是否一致
                if(!oldValue.equals(newValue)){
                    ComparedResult result=new ComparedResult();
                    result.setField(fieldName);
                    result.setFieldName(filedAnoName);
                    result.setOldValue(oldValue);
                    result.setNewValue(newValue);
                    result.setRemark(oldValue+"->"+newValue);
                    ret.add(result);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return ret;
    }
}
image.png

UserEntity

import java.io.Serializable;

public class UserEntity implements Serializable {
    @FieldAnon(name="姓名",filed="name")
    private String name;
    @FieldAnon(name="年齡",filed="age")
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

ComparedResult

import java.io.Serializable;

/**
 * 對比結(jié)果
 */
public class ComparedResult implements Serializable {
    /**
     * 對比字段
     */
    private String field;
    /**
     * 對比字段名稱(說明)
     */
    private String fieldName;
    /**
     * 原來的值
     */
    private Object oldValue;
    /**
     * 修改后的值
     */
    private Object newValue;
    /**
     * 備注
     */
    private String remark;

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public Object getOldValue() {
        return oldValue;
    }

    public void setOldValue(Object oldValue) {
        this.oldValue = oldValue;
    }

    public Object getNewValue() {
        return newValue;
    }

    public void setNewValue(Object newValue) {
        this.newValue = newValue;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "{" +
                "field='" + field + '\'' +
                ", fieldName='" + fieldName + '\'' +
                ", oldValue=" + oldValue +
                ", newValue=" + newValue +
                ", remark='" + remark + '\'' +
                '}';
    }
}

FieldAnon

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnon {
    String filed();
    String name() default "";
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容