java中比較兩個對象屬性值(字段)是否相同,返回屬性名和屬性值的對比值

實際開發中,存在比較兩個對象,需要校驗某些字段是否相同,如果不同,需返回屬性名稱和屬性值對比結果
比較笨的辦法就是,對兩個對象需要判斷的屬性一一進行對比,如果只有幾個屬性值需要對比,可以滿足,但是字段值過多就不使用了,也沒有通用性

下面介紹利用反射機制,判斷兩個對象屬性值是否相同
 

    public static void main(String[] args) throws IllegalAccessException {
        Student student = new Student("小明", "男", "15011112222", "重慶");
        User user = new User("小明", "admin", "15811112222", "北京");

        Map<String, String> diffMap = compareTwoObject(student, user, new String[]{"addr"});
        System.out.println(diffMap);
        // 運行結果 {compare_object: =Student vs User, Student_field:phone=15011112222, User_field:phone=15811112222}
    }

    public static Map<String, String> compareTwoObject(Object obj1, Object obj2, String[] ignoreFields) throws IllegalAccessException {
        Map<String, String> diffMap = new LinkedHashMap<>();
        List<String> ignoreFieldList = Arrays.asList(ignoreFields);
        Class<?> clazz1 = obj1.getClass();
        Class<?> clazz2 = obj2.getClass();
        Field[] fields1 = clazz1.getDeclaredFields();
        Field[] fields2 = clazz2.getDeclaredFields();
        BiPredicate biPredicate = new BiPredicate() {
            @Override
            public boolean test(Object object1, Object object2) {
                if (object1 == null && object2 == null) {
                    return true;
                }
                if (object1 == null && object2 != null){
                    return false;
                }
                // 假如還有別的類型需要特殊判斷 比如 BigDecimal, 演示,只寫BigDecimal示例,其他都相似
                if (object1 instanceof BigDecimal && object2 instanceof BigDecimal) {
                    if (object1 == null && object2 == null) {
                        return true;
                    }
                    if (object1 == null ^ object2 == null) {
                        return false;
                    }
                    return ((BigDecimal) object1).compareTo((BigDecimal) object2) == 0;
                }

                if (object1.equals(object2)) {
                    return true;
                }
                return false;
            }
        };

        for (Field field1 : fields1) {
            for (Field field2 : fields2) {
                if (ignoreFieldList.contains(field1.getName()) || ignoreFieldList.contains(field2.getName())) {
                    continue;
                }
                if (field1.getName().equals(field2.getName())) {
                    field1.setAccessible(true);
                    field2.setAccessible(true);
                    if (!biPredicate.test(field1.get(obj1), field2.get(obj2))) {
                        diffMap.put("compare_object: ", obj1 + " vs " + obj2);
                        diffMap.put(obj1 + "_field:" + field1.getName(), field1.get(obj1).toString());
                        diffMap.put(obj2 + "_field:" + field2.getName(), field2.get(obj2).toString());
                    }
                }
            }
        }
        return diffMap;
    }
class Student {
    private String name;
    private String gender;
    private String phone;
    private String addr;

    public Student(String name, String gender, String phone, String addr) {
        this.name = name;
        this.gender = gender;
        this.phone = phone;
        this.addr = addr;
    }

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "Student";
    }
}

class User {
    private String name;
    private String password;
    private String phone;
    private String addr;

    public User(String name, String password, String phone, String addr) {
        this.name = name;
        this.password = password;
        this.phone = phone;
        this.addr = addr;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User";
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章