比较Java对象中属性的不同

前言

今天同事提了一个需求让我做,大概意思在对一个用户的属性进行编辑后,在数据库中记录操作日志,主要就是记录被修改属性修改前后的值。这个问题简化一下就是判断一个类的两个对象属性值的不同。

两个对象进行比较相等,有两种做法:
1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可。
2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射。也可以先把对象转成Json串,再依次进行比较。

为了后面的举例,我们先新建一个简单的类Student:

package test;
/*
 *author:Marin
 *time:
 */
public class Student {
    private String stuid;
    private String stduname;
    private Integer age;
    public String getStuid() {
        return stuid;
    }
    public void setStuid(String stuid) {
        this.stuid = stuid;
    }
    public String getStduname() {
        return stduname;
    }
    public void setStduname(String stduname) {
        this.stduname = stduname;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

通过类反射比较两个对象的不同

package test;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONObject;

/*
 *author:Marin
 *time:
 */
public class test1 {
    public static void main(String[] args) {
        Student student1=new Student();
        student1.setStuid("08163312");
        student1.setStduname("小马");
        student1.setAge(21);
        Student student2=new Student();
        student2.setStuid("08163311");
        student2.setStduname("小马");
        student2.setAge(19);
        Map<String, String> orgobj = new HashMap<String, String>();
        Map<String, String> nowobj = new HashMap<String, String>();
        Field[] fs = student1.getClass().getDeclaredFields();
        for (Field f : fs) {
            f.setAccessible(true);
            Object v1 = null;
            Object v2 = null;
            try {
                v1 = f.get(student1);
                v2 = f.get(student2);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            if (!equals(v1, v2)) {
                orgobj.put(f.getName(), v1.toString());
                nowobj.put(f.getName(), v2.toString());
            }
        }
        System.err.println(orgobj.toString());
        System.err.println(nowobj.toString());
    }
    public static boolean equals(Object obj1, Object obj2) {

        if (obj1 == obj2) {
            return true;
        }
        if (obj1 == null || obj2 == null) {
            return false;
        }
        return obj1.equals(obj2);
    }
}

通过JSON串来比较两个对象属性的不同

package test;

import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONObject;

/*
 *author:Marin
 *time:
 */
public class test2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Student student1=new Student();
        student1.setStuid("08163312");
        student1.setStduname("小马");
        student1.setAge(21);
        
        Student student2=new Student();
        student2.setStuid("08163311");
        student2.setStduname("小马");
        student2.setAge(19);
        
        JSONObject obj1 = JSONObject.fromObject(student1);
        JSONObject obj2 = JSONObject.fromObject(student2);
         
        Map orgobj = new HashMap();
        Map nowobj = new HashMap();
        for(int i=0;i<obj1.names().size();i++){
            if(!isTheSame(obj1, obj2, i)){
                orgobj.put(obj1.names().get(i), obj1.get(obj1.names().get(i).toString()));
                nowobj.put(obj2.names().get(i), obj2.get(obj2.names().get(i).toString()));
            }
        }
        System.err.println(orgobj.toString());
        System.err.println(nowobj.toString());
    }
    private static boolean isTheSame(JSONObject obj1, JSONObject obj2, int i) {
        return obj1.get(obj1.names().get(i)).equals(obj2.get(obj1.names().get(i)).toString());
    }
}

 

posted @ 2020-09-29 11:42  .有梦想的咸鱼丶  阅读(1258)  评论(0)    收藏  举报