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