Java通用对象状态比较

Java通用对象状态比较,java,object,Java,Object,你能提出任何方法来比较两种对象状态吗 有什么API可以实现这一点吗?或者,只有反思才是答案 请注意:我不需要equals()/compare()方法,因为它们只用于排序,我需要整个对象图比较,这将给我一个匹配或不匹配值的列表。XMLUnit将起作用,它递归地比较列表引用,它还可以选择排除您不希望比较的字段 String expectedXML = "some xml"; String actualXML = "some xml"; DetailedDiff diff1 = new Det

你能提出任何方法来比较两种对象状态吗

有什么API可以实现这一点吗?或者,只有反思才是答案


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

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());
递归元素名称和文本限定符

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

也请参考

也很快我就要写博客了

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

com.thoughtworks.xstream
xstream

重写类中的hashCode&equal方法,该方法将帮助您比较java对象

请参考以下链接


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

存在一个类来帮助您实现
Diffable.diff()
方法


目前还没有一个基于反射的变体,自从我意外地在没有实现的情况下关闭它之后,这个变体实际上已经被遗忘了。oops.

使用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) 

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

您可以使用反射来获取类的字段值。如果字段是相同的,并且它们都有关联的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));
    } 
} 
public void genericCompare(对象一、对象二){
Fields[]oneFields=1.getClass().getFields();
Fields[]twoFields=two.getClass().getFields();
...
/**假设它们具有相同数量的字段*/
for(int t=0;t
关于比较,你知道些什么?在你的类中重写hashCode和equal方法,这将帮助你比较java对象。
equals
不仅用于排序,实际上是比较两个对象显示你从“比较两个对象状态”到“比较两个XML文档”得到了什么?@Musik修改了代码,相信我,比较xml为您提供了更多选项,比较节点,比较节点值,准备使用API
XmlUnit
。如何将pojo转换为xmls?@javainvestor我为您编辑了答案,只需使用上述依赖项,将pojo对象传递给上述方法,它将返回xml。此API有多大用处,假设我需要比较两个相同类型的对象,深层嵌套比较,它会有集合,而且集合内的插入顺序可能不同,所以它可以递归地比较列表内的对象。好的API。但不够通用。我无法访问POJO的源代码(即要比较的对象)。