Java通用对象状态比较

时间:2014-11-17 12:56:12

标签: java object

你能建议任何比较两种对象状态的方法吗?

是否有任何API可以实现这一目标?或者,只有反射才是答案?

请注意:我不需要仅使用equals()/ compare()方法,因为它们仅用于排序,我需要整个对象图比较,这将给出一个匹配或不匹配值的列表。

5 个答案:

答案 0 :(得分:2)

覆盖hashCode&您的类中的等于有助于比较java对象的方法。

请参阅以下链接

link1

link2

link3

答案 1 :(得分:2)

Apache Commons Lang引入了一个Diffable<T>接口,如果一个对象想要与其他对象进行深度比较,则该接口可以实现。与Comparable<T>类似,此接口要求对象可以将自己与同一类型的另一个对象进行深度比较,并生成差异列表。

存在DiffBuilder类来帮助您实施Diffable.diff()方法。

目前还没有基于反射的变体,因为我在没有实施的情况下意外关闭了LANG-637,所以实际上已经忘记了这一点。糟糕!

答案 2 :(得分:1)

使用apache&#39; commons-lang中的CompareToBuilder类。它使用反射并提供一些灵活性来确定要比较什么和不比较什么。这些是一些希望不言自明的方法:

CompareToBuilder.reflectionCompare(Object lhs, Object rhs, boolean compareTransients)
CompareToBuilder.reflectionCompare(Object lhs, Object rhs, String[] excludeFields) {
CompareToBuilder.reflectionCompare(Object lhs, Object rhs, boolean compareTransients, Class reflectUpToClass) 

它将使用反射来遍历整个对象图,以确定对象是否相等。

答案 3 :(得分:1)

好吧,您可以使用反射来获取类的字段值。如果字段相同并且它们都有关联的getter,那么如果你知道它们的类型,你可以比较两个对象。

public void genericCompare(Object one, Object two) {
    Fields [] oneFields = one.getClass().getFields();
    Fields [] twoFields = two.getClass().getFields();
    ...
    /** assuming they have the same number of fields */
    for (int t = 0; t < oneFields.length; t++) {
        System.out.println("Object one \'" + oneFields[t].getName() + "\' has value " + oneFields[t].get(one));
        System.out.println("Object two \'" + twoFields[t].getName() + "\' has value " + twoFields[t].get(two));
    } 
} 

答案 4 :(得分:0)

XMLUnit 可以使用,它会比较列表references recursively,也可以选择排除您不想比较的字段。

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

同时参考this

我很快就会发布这个here

生成XML

import com.thoughtworks.xstream.XStream;

 public static String writeToXml(Object objectToWrite) {
        XStream  xstream   = new XStream();
        return xstream.toXML(objectToWrite);
    }

<强>依赖

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
</dependency>