如何一般地比较整个java bean?

我一直试图在org.apache.commons.beanutils库中找到一个方法/习惯用来评估2个实例之间所有属性的相等性,即bean的通用equals()方法。
有没有一种简单的方法可以使用这个库? 或者我是以错误的方式来做这件事的? 谢谢。

尝试使用commons-lang的 EqualsBuilder.reflectionEquals() 。 EqualsBuilder有一组方法可以包含所有字段,所有非瞬态字段以及除特定字段之外的所有字段。

如果所有其他方法都失败了,那么代码可以作为如何实现它的一个很好的例子。

要直接回答您的问题,您可以使用reflection来对bean进行相等性检查。 您需要注意一些障碍。

有关于equals()和hashcode()行为的规则。 这些规则讨论了对称性,顺从性和反身性,当你的equals方法基于你传入的其他对象动态行为时,这可能很难做到。

有趣的阅​​读: http : //www.geocities.com/technofundo/tech/java/equalhash.html

一般来说,我认为你最好创建自己的哈希码并等于方法。 有一个很好的插件可以根据类属性自动为你生成代码。

说完这一切之后,这里有一些(旧式)方法来获取我很久以前写的getter,setter和properties:

 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; } 

也许你可以用这个来自己动手。

编辑:当然, Aaron Digulla的 反思 建设者的回答比我的手工要好得多。

如上所述,基于reflection的实现将执行您想要的操作。 我只是想警告你,这种反思是相当昂贵的,而且这种实现可能会相当缓慢。 如果你只需要偶尔进行比较,你会没事的。 但是,如果您有大量数据集和频繁的相等性检查(例如过滤大表),您可能会遇到麻烦。

或者,虽然不能直接回答您的问题,但它可能是您的问题的答案(即删除了做超级快速的样板代码的努力)

如果您使用Eclipse,以下步骤将自动生成hashCode并为您等于:

Source>生成hashCode并等于…

然后选择字段,它超级有效! :d

干杯,我希望无论谁来这里,都是为了减少编写样板的时间。

PS:我确定其他流行的IDE必须具有类似的function。