你能建议任何比较两种对象状态的方法吗?
是否有任何API可以实现这一目标?或者,只有反射才是答案?
请注意:我不需要仅使用equals()/ compare()方法,因为它们仅用于排序,我需要整个对象图比较,这将给出一个匹配或不匹配值的列表。
答案 0 :(得分:2)
答案 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>