- 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
modifiedFields = ObjectComparator.getModifiedFields(oldData, newData, "creator"); -
- System.out.println("Modified fields and their values: " + modifiedFields);
- }
- }
-
- class ObjectComparator {
- public static Map
getModifiedFields(Object oldObject, Object newObject, String... ignoreFields) - throws IllegalAccessException {
- Map
modifiedFields = new HashMap<>(); -
- // 获取所有字段
- Field[] fields = oldObject.getClass().getDeclaredFields();
-
- // 忽略字段的名称集合
- Map
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;
- }
- }
在Main类中,创建了OldData和NewData对象作为示例数据。
调用ObjectComparator.getModifiedFields方法,并传入旧对象oldData和新对象newData以及需要忽略的字段名"creator"。
getModifiedFields方法接收两个对象和需要忽略的字段作为参数。
在getModifiedFields方法内部,首先创建一个空的modifiedFields哈希映射,用于存储修改的字段和对应的新值。
通过使用反射获取旧对象的所有字段,包括私有字段。
创建一个哈希映射ignoreFieldMap,用于存储需要忽略的字段名称,并将传入的忽略字段名加入该映射。
使用循环遍历旧对象的所有字段,对每个字段进行如下处理:
将字段设置为可访问状态,以便读取其值。
检查字段是否需要忽略,如果是,则跳过本次循环,继续处理下一个字段。
获取旧对象和新对象中对应字段的值。
比较旧值和新值是否相等,如果不相等,则将字段名称作为键,新值作为值,存入modifiedFields哈希映射中。
循环遍历完所有字段后,返回存储修改字段和新值的modifiedFields哈希映射。
在Main类中打印出修改字段和对应新值的结果。