当前位置: 首页 > 面试题库 >

深度反射比较等于

怀晋
2023-03-14
问题内容

我试图通过将结果对象与原始对象进行比较来验证例程的序列化和反序列化。这些例程可以序列化任意的和深层嵌套的类,因此,我需要一个比较例程,该例程可以提供原始实例和最终实例,并反射性地遍历每种值类型并比较这些值,然后迭代地浸入引用类型以比较值。

我已经尝试过Apache Commons Lang,EqualsBuilder.reflectionEquals(inst1, inst2)但这似乎并没有进行很深入的比较,它只是比较引用类型是否相等,而没有深入研究它们:

以下代码说明了我的问题。第一次调用reflectionEquals返回true,但是第二次返回false。

是否有任何人可以推荐的图书馆例程?

class dummy {
    dummy2 nestedClass;
}

class dummy2 {
    int intVal;
}

@Test
public void testRefEqu() {

    dummy inst1 = new dummy();
    inst1.nestedClass = new dummy2();
    inst1.nestedClass.intVal = 2;
    dummy inst2 = new dummy();
    inst2.nestedClass = new dummy2();
    inst2.nestedClass.intVal = 2;
    boolean isEqual = EqualsBuilder.reflectionEquals(inst1.nestedClass, inst2.nestedClass);
    isEqual = EqualsBuilder.reflectionEquals(inst1, inst2);
}

问题答案:

从这个问题的答案https://stackoverflow.com/a/1449051/116509以及一些初步测试来看,Unitils似乎可以满足ReflectionAssert.assertReflectionEquals您的期望。(编辑:但可能会被放弃,因此您可以尝试AssertJ
https://joel-costigliola.github.io/assertj/assertj-core-features-
highlight.html#field-by-field-recursive

我对EqualsBuilder的这种行为感到非常震惊,因此感谢您提出问题。在此网站上有很多推荐它的答案-我想知道推荐它的人是否意识到了这一点?



 类似资料:
  • 问题内容: 我在Java中有两个比较对象的集合。有没有一种方法可以比较集合,以便调用的方法而不仅仅是比较引用? 问题答案: 的每个孩子都这样做。查看文件 比较指定对象与此设置的相等性。如果给定对象也是一个集合,两个集合的大小相同,并且给定集合的每个成员都包含在此集合中,则返回true。这样可以确保equals方法可在Set接口的不同实现中正常工作。此实现首先检查指定的对象是否为此集合;如果是这样,

  • 我正在尝试将ArrayList转换为Treemap,所以我编写了一个比较各种方法的基准: 1)并行流中的toMap 2)toMap在流中 3)流中forEach 主 大小为10_000的输出如下 “for loop”与预期一样是最慢的 回到正题,为什么当arraylist列表很大时,for each in parallel steam会失败? 运行i7 2670QM,因此线程池大小应为8

  • 问题内容: 我试图以一种通用的方式比较两个不同对象的字段值。我有一个函数(如下所示),该函数接受两个Object,然后获取字段,然后在循环中比较这些字段,如果它们不相同,则将这些字段添加到列表中- 这是执行此操作的正确方法吗? 我在谷歌上搜索,发现C#就像一个PropertyInfo类- Java是否有类似的东西?另外,有没有办法做-我知道没有这样的方法,但也许还有另一种方法? 问题答案: 您可以

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 是否有一种惯用的方法来比较两个NumPy数组,它们将NaN视为彼此相等(但不等于NaN以外的任何东西)。 例如,我希望以下两个数组比较相等: 和以下两个数组进行比较: 我正在寻找一种可以产生标量布尔结果的方法。 以下方法可以做到这一点: 但它很笨重,并且创建了所有这些中间数组。 有没有一种方法可以更容易地观察眼睛,更好地利用记忆? 另外,如果有帮助的话,已知数组具有相同的形状和数据类型。

  • 问题内容: 我想从那些在Java中使用原始相等性有更多经验的人那里获得一些建议。使用两次双打,由于可能的舍入误差而不够。 我的问题是: Java 在某种程度上处理舍入错误吗?如1.7文档中所述,如果数值等于,则返回值。有人确定它们在数值上相等是什么意思吗? 对某些增量值使用相对误差计算,您会建议使用通用的增量值(不是特定于应用程序)吗?请参见下面的示例。 以下是考虑相对误差的用于检查相等性的通用函