我一直在嘗試討論org.apache.commons.beanutils庫的方法/習慣用法,以評估兩個實例之間相等的所有屬性,即Bean的泛型equals()方法。
有沒有一個簡單的方法來做到這一點usnig這個庫?還是我以錯誤的方式去做這件事? 謝謝。如何一般比較整個java bean?
回答
嘗試EqualsBuilder.reflectionEquals()的commons-lang。 EqualsBuilder有一套方法來包含所有字段,所有非瞬態字段以及除某些字段外的所有字段。
如果一切都失敗了,代碼可以作爲一個很好的例子來說明如何實現這一點。
小的增強警告,這不是遞歸的 - 所以如果你有嵌套的bean(即一個bean的屬性是另一個bean),他們需要實現自己的平等。 `reflectionEquals`只是在每個屬性上調用`equals`,它不會進一步反映到類中。 – artbristol 2012-10-08 10:01:30
@artbristol:+1但要小心遞歸等於:當bean形成循環時,可以很容易地陷入循環。 – 2012-10-08 11:52:19
要直接回答您的問題,您可以使用反射來進行bean的平等檢查。有幾點需要注意的問題。
有關於equals()和hashcode()的行爲的規則。這些規則談對稱性,consitency和reflexiveness這可能是很難當你的equals方法的行爲動態基於你傳遞在其他物體上做
有趣的閱讀。 http://www.geocities.com/technofundo/tech/java/equalhash.html
一般來說,我覺得你最好創建自己的哈希碼和等於方法。有一個很好的插件可以根據類的屬性自動生成代碼。
說了這麼多,這裏有一些(舊風格)方法得到的getter,setter方法和屬性我很久以前寫道:
private Map getPrivateFields(Class clazz, Map getters, Map setters) {
Field[] fields = clazz.getDeclaredFields();
Map m = new HashMap();
for (int i = 0; i < fields.length; i++) {
int modifiers = fields[i].getModifiers();
if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers)) {
String propName = fields[i].getName();
if (getters.get(propName) != null && setters.get(propName) != null) {
m.put(fields[i].getName(), fields[i]);
}
}
}
return m;
}
使消氣:
private Map getGetters(Class clazz) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("get")) {
int modifiers = methods[i].getModifiers();
if (validAccessMethod(modifiers)) {
m.put(getPropertyName(methods[i].getName()), methods[i]);
}
}
}
return m;
}
而安裝者:
private Map getSetters(Class clazz, Map getters) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("set")) {
int modifiers = methods[i].getModifiers();
String propName = getPropertyName(methods[i].getName());
Method getter = (Method) getters.get(propName);
if (validAccessMethod(modifiers) && getter != null) {
Class returnType = getter.getReturnType();
Class setType = methods[i].getParameterTypes()[0];
int numTypes = methods[i].getParameterTypes().length;
if (returnType.equals(setType) && numTypes == 1) {
m.put(propName, methods[i]);
}
}
}
}
return m;
}
也許你可以使用它來推出自己的。
編輯:當然reflectionbuilder在Aaron Digulla's answer比我的手工好得多。
布爾getter被稱爲isFoo(),所以代碼將需要在getGetters() – 2012-06-15 14:13:21
如上所述,基於反射的實現將做你想做的事情。我只是想警告你,這種反映非常昂貴,而且這種實施可能會相當緩慢。如果你只是偶爾進行比較,你會沒事的。但是,如果您有大量的數據集和頻繁的平等檢查(例如過濾大表),您可能會遇到麻煩。
或者,雖然沒有直接回答你的問題,但它可能是一個回答您的問題(即除去做樣板代碼而是超快的努力)
如果你使用Eclipse,在下面的步驟將自動生成的hashCode和equals你:
源>生成的hashCode和equals ...
,然後選擇字段,它非常有效!:D
乾杯,我希望它能幫助來到這裏的人減少寫一些樣板文件的時間。 PS:我相信其他流行的IDE必須具有類似的功能。
- 1. 2個單元格的一般比較
- 2. 如何比較一個整數與lambda?
- 3. 如何比較一個NSUserDefaults整數與另一個整數?
- 4. 如何比較2個一般類型的對象
- 5. SSRS - 如何比一般表
- 6. Java比較整數和bigInteger
- 7. 比較一般合同違規
- 8. 如何將一個nsarray與一個整數進行比較
- 9. Java 7:java.lang.IllegalArgumentException:比較方法違反了它的一般合同
- 10. 如何比較三個整數值?
- 11. 如何比較兩個整數對象?
- 12. 如何在Java bean中執行不精確的比較?
- 13. Java比較一個BufferedImage到另一個
- 14. 如何比較java中的兩個hashmaps?
- 15. 如何比較Java中的兩個值
- 16. 如何比較兩個java對象
- 17. 如何比較java中的多個類?
- 18. 如何比較Java中的兩個值?
- 19. 我看到一個整數比較
- 20. Android中的Bean比較器
- 21. 如何DIFF-比較用java
- 22. 如何比較在Java
- 23. 如何將java bean的屬性傳遞給另一個java bean?
- 24. 擴展一個java比較來比較特定的類實現它比較了
- 25. Lua比較多個整數
- 26. 比較兩個整數
- 27. C++逐個比較整數
- 28. 比較三個整數值
- 29. 比較整數
- 30. 比較整數
[xtendbeans library](http://stackoverflow.com/a/39222891/421602)可能會在這方面感興趣;請參閱[在其他SO問題上的完整示例](http://stackoverflow.com/a/39222891/421602)。 – vorburger 2016-08-30 08:54:58