是否有类似于Unix程序diff的Java实用程序库,但是对于对象呢?我正在寻找能够比较相同类型的两个对象并生成表示它们之间差异的数据结构的东西(并且可以递归地比较示例变量中的差异)。我不是在寻找文本diff的Java实现。我也不是正在寻求如何使用反射来完成此操作的帮助。
我正在维护的应用程序具有此功能的脆弱实现,其中有一些糟糕的设计选择,需要重写,但如果我们可以使用现成的东西,那将更好。
这里有一个我正在寻找的东西的例子:
SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
a.setProp1("A");
a.setProp2("X");
b.setProp1("B");
b.setProp2("X");
DiffDataStructure diff = OffTheShelfUtility.diff(a, b); // magical recursive comparison happens here
比较之后,实用程序会告诉我,“prop1”在两个对象之间是不同的,而“prop2”是相同的。我认为DiffDataStructure是树是最自然的,但是如果代码是可靠的,我就不会挑剔。
8条答案
按热度按时间irtuqstp1#
可能有点晚了,但我和你的情况一样,最终为你的用例创建了我自己的库。由于我被迫自己提出一个解决方案,我决定在Github上发布它,以节省其他人的辛苦工作。你可以在这里找到它:https://github.com/SQiShER/java-object-diff
---编辑--
下面是一个基于OP代码的小用法示例:
bz4sfanl2#
http://javers.org是一个库,它完全符合您的需要:具有返回Diff对象的compare(Object leftGraph,Object rightGraph)等方法。Diff包含更改列表(ReferenceChange,ValueChange,PropertyChange),例如
它可以处理图中的循环。
此外,你可以得到任何图形对象的快照。Javers有JSON序列化器和反序列化器来快照和更改,这样你就可以很容易地将它们保存在数据库中。有了这个库,你可以很容易地实现一个审计模块。
vsaztqbk3#
你也可以看看Apache的解决方案,大多数项目已经在类路径上有了它,因为它是commons-lang的一部分。
检查特定字段的差异:
http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/DiffBuilder.html
使用反射检查差异:
http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/ReflectionDiffBuilder.html
pod7payv4#
所有的Javers库都只支持Java 7,我遇到了一个问题,因为我想把它用于Java 6项目,所以我碰巧取了源代码,并以一种适合Java 6的方式进行了更改,下面是github代码。
https://github.com/sand3sh/javers-forJava6
罐链接:https://github.com/sand3sh/javers-forJava6/blob/master/build/javers-forjava6.jar
我只改变了Java 7支持的“〈〉”固有的转换为Java 6支持,我不保证所有的功能都能工作,因为我已经为我注解了一些不必要的代码,它适用于所有自定义对象比较。
pqwbnv8z5#
也许这会有帮助,这取决于你在哪里使用这段代码,它可能是有用的或有问题的。测试了这段代码。
ryevplcw6#
首先,我们必须将对象转换为贴图:
之后,将Map转换为平面Map:
最后调用getDifferenceBetween2Maps来获取差异:
使用示例:
jjhzyzn07#
深入比较一个对象的所有属性的一个好方法是将它们转换为
java.util.Map
。这样,java.util.Map#equals
将深入比较对象,工作就完成了!唯一的问题是将对象转换为Map。一种方法是使用带有
org.codehaus.jackson.map.ObjectMapper
的reflexion。因此,存在一个来自
com.google.common.collect.MapDifference
的工具,用于描述两个Map之间的差异。wn9m85ua8#
快速判断两个对象是否不同的更简单方法是使用apache commons库