【问题标题】:Deep Comparision of Two Java Objects两个 Java 对象的深度比较
【发布时间】:2014-11-12 18:47:32
【问题描述】:

已经提到了几个问题herethere

用例 -

1.) 给定任何Two objectscompare,它们都是逐个属性的。

2.) 它还将包含Collections,现在比较两个对象的集合,现在集合内部相同的数据可以颠倒,这意味着说我有List<Address>,它包含两个条目(比如@987654327 @, Office Address),但在两个列表中,数据可能位于不同的索引处。

3.) 需要创建相同类型的3rd Object,复制相似的数据,并将属性设置为 null 并使用不同的数据。

4.) 它也可能有引用类。

我厌倦了许多解决方案,但卡在某个地方或其他地方,我正在考虑编写一些通用解决方案。虽然generating two xml's 是从两个对象中取出然后逐个节点比较,但只是想获得更多的选择。

或者在这种情况下,Java reflection 的强度要高多少。

【问题讨论】:

  • 这听起来很难。我不会使用反射,它将无法可靠地访问私有字段和私有对象。也许像 Kryo 之类的东西并解析输出,但这很麻烦。
  • @markspace 嗨,刚刚发布了您评论的答案,不知道我是否必须发布作为答案或评论。

标签: java xml reflection comparison equals


【解决方案1】:

回答@markspace 问题。

要访问private field,您需要调用Class.getDeclaredField(String name)Class.getDeclaredFields() 方法。 Class.getField(String name)Class.getFields() 方法只有 return public fields,所以它们不起作用。

要访问private method,您需要调用Class.getDeclaredMethod(String name, Class[] parameterTypes)Class.getDeclaredMethods() 方法。方法Class.getMethod(String name, Class[] parameterTypes)Class.getMethods() 仅方法return public methods

XMLUnit 会起作用,它会递归地比较列表引用,还可以选择排除您不想比较的字段。

 String expectedXML = "some xml";
 String actualXML = "some xml";

 DetailedDiff diff1 = new DetailedDiff(XMLUnit.compareXML(expectedXML, actualXML));
 diff1.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
 System.out.println("Differences found: " + diff1.getAllDifferences().toString());

RecursiveElementNameAndTextQualifier

比较两段 XML 中的所有 Element 和 Text 节点。允许 返回的复杂、深度嵌套类型的元素 不同的订单但具有相同的内容被识别为 可比。

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多