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


    1. import java.lang.reflect.Field;
    2. import java.math.BigDecimal;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. public class Main {
    6. public static void main(String[] args) throws IllegalAccessException {
    7. OldData oldData = new OldData("John", 25, 10.5, "Alice");
    8. NewData newData = new NewData("John Doe", 30, 9.8, "Bob");
    9. Map modifiedFields = ObjectComparator.getModifiedFields(oldData, newData, "creator");
    10. System.out.println("Modified fields and their values: " + modifiedFields);
    11. }
    12. }
    13. class ObjectComparator {
    14. public static Map getModifiedFields(Object oldObject, Object newObject, String... ignoreFields)
    15. throws IllegalAccessException {
    16. Map modifiedFields = new HashMap<>();
    17. // 获取所有字段
    18. Field[] fields = oldObject.getClass().getDeclaredFields();
    19. // 忽略字段的名称集合
    20. Map ignoreFieldMap = new HashMap<>();
    21. for (String field : ignoreFields) {
    22. ignoreFieldMap.put(field, true);
    23. }
    24. for (Field field : fields) {
    25. field.setAccessible(true);
    26. // 检查字段是否需要忽略
    27. if (ignoreFieldMap.containsKey(field.getName())) {
    28. continue;
    29. }
    30. // 获取字段的值
    31. Object oldValue = field.get(oldObject);
    32. Object newValue = field.get(newObject);
    33. // 比较字段的值
    34. if (oldValue == null && newValue != null || oldValue != null && !oldValue.equals(newValue)) {
    35. modifiedFields.put(field.getName(), newValue);
    36. }
    37. }
    38. return modifiedFields;
    39. }
    40. }
    41. class OldData {
    42. private String name;
    43. private int age;
    44. private double score;
    45. private String creator;
    46. public OldData(String name, int age, double score, String creator) {
    47. this.name = name;
    48. this.age = age;
    49. this.score = score;
    50. this.creator = creator;
    51. }
    52. }
    53. class NewData {
    54. private String name;
    55. private int age;
    56. private double score;
    57. private String creator;
    58. public NewData(String name, int age, double score, String creator) {
    59. this.name = name;
    60. this.age = age;
    61. this.score = score;
    62. this.creator = creator;
    63. }
    64. }
    1. Main类中,创建了OldDataNewData对象作为示例数据。

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

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

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

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

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

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

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

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

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

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

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

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

     

  • 相关阅读:
    【沐风老师】3DMAX一键生成圣诞树建模插件使用教程
    我的周刊(第067期)
    【c语言】贪吃蛇
    企业架构LNMP学习笔记54
    SuffixArray练习题
    Sliver C2 实战 vulntarget-f
    1856. 子数组最小乘积的最大值-前准和+单调栈
    十个最为戳心测试/开程序员笑话,念茫茫人海,该如何寻觅?
    joomscan工具使用(针对joomla扫描)
    pycharm安装库失败
  • 原文地址:https://blog.csdn.net/qq_35144624/article/details/132873414