参考:https://1609919154.iteye.com/blog/2400400

 

参考2  https://www.cnblogs.com/creaky/p/10802950.html

待整理: 结合1 ,2

 

整理一: 结合注解去比较两个对象的不同:-->只去比较带有注解的字段

ContrastObjUtils:

package com.sea.test.utils;

import java.beans.PropertyDescriptor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author sea
 * 比较两个Bean的内容
 * @param <T>
 */
public class ContrastObjUtils<T> {

    /**
     * 自定义注解,如果字段上有该注解,就比较
     * @author sea
     *
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ComparaField {
          String value()  default "";
    }
    
    /**
     * 之比较有注解的字段
     * @param oldBean
     * @param newBean
     * @return
     */
    public String comparObjWithAnnotion(Object oldBean, Object newBean) {
        String result = "";
        T pojo1 = (T) oldBean;
        T pojo2 = (T) newBean;
        try {
            Class clazz = pojo1.getClass();
            Field[] fields = pojo1.getClass().getDeclaredFields();
            int i = 1;

            // loop all field
            for (Field field : fields) 
            {
                boolean hasAnnotation = field.isAnnotationPresent(ComparaField.class);
                // 如果没有注解,skip
                if (!hasAnnotation) {
                    continue;
                }
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = pd.getReadMethod();
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = getMethod.invoke(pojo2);
                if (o1 == null || o2 == null) {
                    continue;
                }

                if (!o1.toString().equals(o2.toString())) 
                {
                    if (i != 1) 
                    {
                        result += "";
                    }
                    // 要显示的字段名
                    String fieldName = field.getName();
                    result += i + "" + fieldName + ",旧值:" + o1 + ",新值:" + o2;
                }
                i++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 比较所有field
     * @param oldBean
     * @param newBean
     * @return
     */
    public String comparObj(Object oldBean, Object newBean) {
        String result = "";
        T pojo1 = (T) oldBean;
        T pojo2 = (T) newBean;
        try {
            Class clazz = pojo1.getClass();
            Field[] fields = pojo1.getClass().getDeclaredFields();
            int i = 1;

            // loop all field
            for (Field field : fields) {
                if ("serialVersionUID".equals(field.getName())) {
                    continue;
                }
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = pd.getReadMethod();
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = getMethod.invoke(pojo2);
                if (o1 == null || o2 == null) {
                    continue;
                }
                if (!o1.toString().equals(o2.toString())) {
                    if (i != 1) {
                        result += "";
                    }
                    // 要显示的字段名
                    String fieldName = "";
                    fieldName = field.getName();

                    result += i + "" + fieldName + ",旧值:" + o1 + ",新值:" + o2;
                    i++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}

 

 

test ----------------------------------------------------

 

pojo: 

package com.sea.test.pojo;

import java.io.Serializable;

import com.sea.test.utils.ContrastObjUtils.ComparaField;

public class User implements Serializable{

    @ComparaField
    private String name ;
    private String age ;
    @ComparaField
    private String hobby ;
    private String weight ;
    private String  addr;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getHobby() {
        return hobby;
    }
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
    public String getWeight() {
        return weight;
    }
    public void setWeight(String weight) {
        this.weight = weight;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    /**
     * 
     * @param name
     * @param age
     * @param hobby
     * @param weight
     * @param addr
     */
    public User(String name, String age, String hobby, String weight, String addr) {
        super();
        this.name = name;
        this.age = age;
        this.hobby = hobby;
        this.weight = weight;
        this.addr = addr;
    }
    public User() {
        super();
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", hobby=" + hobby + ", weight=" + weight + ", addr=" + addr
                + "]";
    }
    
    
    
}
View Code

相关文章: