我遇到了用用户所做的任何更改更新现有数据的问题。
例如,我有一个公司对象如下
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");
现在用户创建了另一个公司实例,只是为了更新现有Company
的name
和url
Company newCompany = new Company();
newCompany.setId("id12345678");
newCompany.setName("company New Name");
newCompany.setUrl("company New Url");
可以看到,Company
的新实例与旧实例具有相同的 Id
,但具有不同的 name
和 url
。
是否有任何实用工具/库可以简单地找到这两个对象之间的所有差异并将更改应用到 company
实例? (不是很想写代码去手动比较每个字段)
有点像
company = AwesomeLibraryUtils.compareAndApplyDifferences(company, newCompany);
在此之后,company
实例保持相同的 id,但具有来自 newCompany< 的
实例。name
和 url
的所有新值
谢谢。
最佳答案
使用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/