在Java中比较对象修改字段并忽略指定字段的方法

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

public class Main {
    public static void main(String[] args) throws IllegalAccessException {
        OldData oldData = new OldData("John", 25, 10.5, "Alice");
        NewData newData = new NewData("John Doe", 30, 9.8, "Bob");

        Map<String, Object> modifiedFields = ObjectComparator.getModifiedFields(oldData, newData, "creator");

        System.out.println("Modified fields and their values: " + modifiedFields);
    }
}

class ObjectComparator {
    public static Map<String, Object> getModifiedFields(Object oldObject, Object newObject, String... ignoreFields)
            throws IllegalAccessException {
        Map<String, Object> modifiedFields = new HashMap<>();

        // 获取所有字段
        Field[] fields = oldObject.getClass().getDeclaredFields();

        // 忽略字段的名称集合
        Map<String, Boolean> ignoreFieldMap = new HashMap<>();
        for (String field : ignoreFields) {
            ignoreFieldMap.put(field, true);
        }

        for (Field field : fields) {
            field.setAccessible(true);

            // 检查字段是否需要忽略
            if (ignoreFieldMap.containsKey(field.getName())) {
                continue;
            }

            // 获取字段的值
            Object oldValue = field.get(oldObject);
            Object newValue = field.get(newObject);

            // 比较字段的值
            if (oldValue == null && newValue != null || oldValue != null && !oldValue.equals(newValue)) {
                modifiedFields.put(field.getName(), newValue);
            }
        }

        return modifiedFields;
    }
}

class OldData {
    private String name;
    private int age;
    private double score;
    private String creator;

    public OldData(String name, int age, double score, String creator) {
        this.name = name;
        this.age = age;
        this.score = score;
        this.creator = creator;
    }
}

class NewData {
    private String name;
    private int age;
    private double score;
    private String creator;

    public NewData(String name, int age, double score, String creator) {
        this.name = name;
        this.age = age;
        this.score = score;
        this.creator = creator;
    }
}
  1. Main类中,创建了OldDataNewData对象作为示例数据。

  2. 调用ObjectComparator.getModifiedFields方法,并传入旧对象oldData和新对象newData以及需要忽略的字段名"creator"。

  3. getModifiedFields方法接收两个对象和需要忽略的字段作为参数。

  4. getModifiedFields方法内部,首先创建一个空的modifiedFields哈希映射,用于存储修改的字段和对应的新值。

  5. 通过使用反射获取旧对象的所有字段,包括私有字段。

  6. 创建一个哈希映射ignoreFieldMap,用于存储需要忽略的字段名称,并将传入的忽略字段名加入该映射。

  7. 使用循环遍历旧对象的所有字段,对每个字段进行如下处理:

    • 将字段设置为可访问状态,以便读取其值。

    • 检查字段是否需要忽略,如果是,则跳过本次循环,继续处理下一个字段。

    • 获取旧对象和新对象中对应字段的值。

    • 比较旧值和新值是否相等,如果不相等,则将字段名称作为键,新值作为值,存入modifiedFields哈希映射中。

  8. 循环遍历完所有字段后,返回存储修改字段和新值的modifiedFields哈希映射。

  9. Main类中打印出修改字段和对应新值的结果。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值