两个Java对象的深度比较

时间:2014-11-12 01:33:59

标签: java xml reflection comparison equals

已经提到了几个问题herethere

用例 -

1。)根据属性给出任何Two objectscompare属性。

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

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

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

我厌倦了许多解决方案,但是在某处或另一方面,我正在考虑编写一些通用的解决方案。虽然两个对象中有generating two xml's,然后逐个节点地进行比较,但只想获得更多选项。

或者Java reflection在这种情况下更强大。

1 个答案:

答案 0 :(得分:0)

回答@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节点。允许   返回的复杂,深层嵌套类型的元素   不同的订单但具有相同的内容被识别为   可比性。