Java对象diff实用程序

Sak*_*ket 4 java diff

我正在寻找Java中的通用实用程序,它可以帮助我为两个对象(相同类型)创建差异报告.

例如,如果我的类结构是:

class A {
  int p1;
  string p2;
  B b1;
}

class B {
 float p3;
}
Run Code Online (Sandbox Code Playgroud)

我想要一个报告b/w两个类型A的对象(比如a1和a2),如下所示:a1 vs. a2

p1 : 'remove'
p2 : 'change'
b1.p3: 'add'
Run Code Online (Sandbox Code Playgroud)

其中,如果属性在第二个对象中为null,则设置'remove',如果属性存在但是具有不同的值则为'change',如果第一个对象中的属性为null,则为'add'.

对于收集对象来说,它可能变得更加棘手/棘手......

SQi*_*hER 10

我为此创建了一个库:https://github.com/SQiShER/java-object-diff

它构建了比较对象的树结构,并允许您通过访问者模式遍历节点.查看" 入门"页面,查看一些示例.它适用于几乎任何类型的对象,可以处理任意数量的嵌套级别.我甚至设法基于它构建一个自动对象合并.

这种对象图的打印版本如下所示:

Property at path '/contacts/item[Walter White]/middleName' has been added => [ Hartwell ]
Property at path '/contacts/item[Jesse Pinkman]/middleName' has been added => [ Bruce ]
Run Code Online (Sandbox Code Playgroud)

我自己使用它,它就像一个魅力.希望能帮助到你!

我不知道你的对象有多复杂,但是通过反射手动完成它会很快失控.特别是当地图和收藏集涉及时.


Paw*_*zyk 7

Javers是一个图书馆,可以满足您的需求:

given:
DummyUser user =  dummyUser("id").withSex(FEMALE).build();
DummyUser user2 = dummyUser("id").withSex(MALE).build();
Javers javers = JaversBuilder.javers().build()

when:
Diff diff = javers.compare(user, user2)

then:
diff.changes.size() == 1
ValueChange change = diff.changes[0]
change.leftValue == FEMALE
change.rightValue == MALE
Run Code Online (Sandbox Code Playgroud)

它可以处理图形中的循环.

此外,您还可以获取任何图形对象的快照.Javers有JSON序列化器和反序列化器来快照和更改,还在mongoDB中实现了存储.