Java泛型对象状态比较

3

你能提供比较两个对象状态的方法么?

是否有API可以实现这一功能?或者只有反射是答案?

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


1
你对比较有什么了解? - SMA
在你的类中覆盖hashCode和equal方法,这将有助于比较Java对象。 - Pushkar
“equals” 不仅用于排序,它实际上是用于比较两个对象的。 - user902383
5个回答

2

在您的类中覆盖hashCode和equal方法,这将有助于您比较Java对象。

请参考以下链接

链接1

链接2

链接3


2
Apache Commons Lang引入了一个Diffable<T>接口,如果一个对象想要与其他对象进行深度比较,则可以实现该接口。类似于Comparable<T>,该接口要求一个对象能够与同类型的另一个对象进行深度比较,并生成差异列表。
存在一个DiffBuilder类来帮助您实现Diffable.diff()方法。
目前还没有基于反射的变体,这是由于我意外地关闭了LANG-637而没有实现它。糟糕。

这个API有多有用呢?比如说我需要比较两个相同类型的对象,进行深度嵌套比较,其中可能包含集合,而且在集合中插入的顺序可能不同,那么它能否递归地比较列表中的对象呢? - Ankur Singhal
良好的 API。但不够通用。我无法访问我的 POJO(即要比较的对象)的源代码。 - javaCurious

1
使用Apache的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) 

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

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));
    } 
} 

0

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 片段中的所有元素和文本节点。允许识别具有相同内容但以不同顺序返回的复杂嵌套类型的元素可进行比较。

请参阅this

很快我会在这里发布博客。

生成 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>

你如何从“比较两个对象状态”转换为“比较两个XML文档”? - musiKk
@musiKk 修改了代码,相信我,比较 XML 可以给你更多的选项,比较节点、比较节点值,使用 XmlUnit API 即可。 - Ankur Singhal
如何将我的POJO转换为XML? - javaCurious
@javaInvestigator 我已经为您编辑了我的答案,只需使用上述依赖项,将您的pojo对象传递给上述方法,它将返回xml。 - Ankur Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接