深度递归对象比较(再次)

And*_*niy 10 java reflection compare

SO上有两个类似的问题:

是否有Java反射实用程序来对两个对象进行深度比较?

深反射比较等于

但是,很有趣,他们都没有给出完全正确的答案.

我和其他问题的作者真正想要的是,某些库中的一些方法只会告诉两个对象是否相等:

boolean deepEquals(Object obj1, Object obj2)

即没有抛出任何异常等等.

apacheEqualsBuilder不是方法,因为它没有深刻的比较.

Unitils似乎也是不好的决定,因为它的方法不回归truefalse; 如果比较失败,它只会引发异常.当然,它可以像这样使用:

Difference difference = ReflectionComparatorFactory.createRefectionComparator(new ReflectionComparatorMode[]{ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS}).getDifference(oldObject, newObject);

但它似乎非常难看,并且unitils库完全似乎太难以进行必要的比较.

此外,很清楚如何deepEquals通过self 创建这样的,但是不太可能没有包含已经实现的方法的常用库.有任何想法吗?

riz*_*joj 3

Java 1.7 有Objects.deepEquals(Object a, Object b)

不幸的是,Unitils该类ReflectionAssert没有返回trueor的附带方法false。你可以试试:

https://github.com/jdereg/java-util

DeepEquals类具有DeepEquals.deepEquals(Object a, Object b)DeepEquals.deepHashCode(Object o)方法,您可以使用它们来覆盖您的类的equalshashCode方法或在外部ComparatorEquivalence.

注意:此 DeepEquals 实现有一个限制。如果该类具有用户定义的重写 equals 方法,则该方法将优先。

  • 问题的作者没有明确地写出来,但我认为根据引用的问题,他想要一个反射 equals,即比较对象,而不是在它们上实现 `equals` 方法。`Objects.deepEquals(Object a, Object b)` 不使用反射进行比较。它依赖于“equals”方法,“deep”部分指的是比较数组,而不是具有引用类型的字段。 (4认同)