java - 比较两个对象中的字段并在 Java 中将一个更新为另一个

标签 java

我遇到了用用户所做的任何更改更新现有数据的问题。

例如,我有一个公司对象如下

public class Company {

    private String id;

    private String name;

    private String url;

    //Getter and setter.....
}

现在我有一个公司实例,数据如下

Company company = new Company();
company.setId("id12345678");
company.setName("company Old Name");
company.setUrl("company Old Url");

现在用户创建了另一个公司实例,只是为了更新现有Companynameurl

Company newCompany = new Company();
newCompany.setId("id12345678");
newCompany.setName("company New Name");
newCompany.setUrl("company New Url");

可以看到,Company 的新实例与旧实例具有相同的 Id,但具有不同的 nameurl

是否有任何实用工具/库可以简单地找到这两个对象之间的所有差异并将更改应用到 company 实例? (不是很想写代码去手动比较每个字段)

有点像

company = AwesomeLibraryUtils.compareAndApplyDifferences(company, newCompany);

在此之后,company 实例保持相同的 id,但具有来自 newCompany< 的 nameurl 的所有新值 实例。

谢谢。

最佳答案

使用reflect查找company和newCompany中getters和setters的所有结果。

基本上,我在这里所做的如下:

1.将newCompany中getter的所有结果放入一个名为hm的HashMap中。

2。扫描公司中 setter/getter 的结果。如果hm不包含company中任何一个getters的结果,则认为这两个公司是不同的。

3。如果两个公司不同,将company中的值设置为newCompany中的值。

public static void compareAndApplyDifferences(Object o1, Object o2) {
    if(!o1.getClass().equals(o2.getClass())) {
        return;
    }
    // check if the result of getters in o1 and o2 are different
    boolean isDiff = false;
    Class<? extends Object> c1 = o1.getClass();
    Class<? extends Object> c2 = o2.getClass();
    Method[] methods1 = c1.getMethods();
    Method[] methods2 = c2.getMethods();
    Map<String, Object> hm = new HashMap<String, Object>();
    for (Method method2 : methods2) {
        if (isGetter(method2)) {
            try {
                Object getterResult = method2.invoke(o2);
                hm.put(method2.getName().substring(3), getterResult);
            } catch (IllegalAccessException e) {
            } catch (IllegalArgumentException e) {
            } catch (InvocationTargetException e) {
            }
        }
    }
    for (Method method1 : methods1) {
        if (isGetter(method1)) {
            try {
                String getterResult = (String) method1.invoke(o1);
                if (!hm.containsValue(getterResult)) {
                    isDiff = true;
                    break;
                }
            } catch (IllegalAccessException e) {
            } catch (IllegalArgumentException e) {
            } catch (InvocationTargetException e) {
            }
        }
    }

    if (isDiff) {
        // set the values in o1 as the values in o2
        for (Method method1 : methods1) {
            if (isSetter(method1)) {
                try {
                    method1.invoke(o1, hm.get(method1.getName().substring(3)));
                } catch (IllegalAccessException e) {
                } catch (IllegalArgumentException e) {
                } catch (InvocationTargetException e) {
                }
            }
        }
    } else {
        return;
    }
}

private static boolean isGetter(Method method) {
    if (!method.getName().startsWith("get"))
        return false;
    if (method.getParameterTypes().length != 0)
        return false;
    if (void.class.equals(method.getReturnType()))
        return false;
    return true;
}

private static boolean isSetter(Method method) {
    if (!method.getName().startsWith("set"))
        return false;
    if (method.getParameterTypes().length != 1)
        return false;
    return true;
}

这是我的程序的演示:

public static void main(String[] args) {

    Company company = new Company();
    company.setId("id12345678");
    company.setName("company Old Name");
    company.setUrl("company Old Url");

    Company newCompany = new Company();
    newCompany.setId("id12345678");
    newCompany.setName("company New Name");
    newCompany.setUrl("company New Url");

    AwesomeLibraryUtils.compareAndApplyDifferences(company, newCompany);

    System.out.println(company.getId());   // id12345678
    System.out.println(company.getName()); // company New Name
    System.out.println(company.getUrl());  // company New Url
}

关于java - 比较两个对象中的字段并在 Java 中将一个更新为另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32816189/

相关文章:

java - JSTL:如何获取Map的上一个和下一个迭代元素?

java - 在Java中获取音频文件的时间属性

java - 发生未知错误,请检查 HTTP 结果代码和服务器响应的内部异常

java - 带退出的 TestNg 控制台应用程序

java - DocuSign Base64 PDF 转换问题

java - 解决 io.netty :netty-transport-native-epoll 时 Jenkins 中的 Maven 出错

java - JdbcBatchItemWriter - 关键字 'ON' 附近的语法不正确

java - 从一个线程写入套接字 channel 并从另一个线程选择

JAVA - 使用 Box.createGlue() 将对象放置在屏幕底部?

java - TreeMap 如何搜索给定条目的后继者?