4

我想以类似于Hibernate Envers所做的方式保留对我的 bean 所做的更改(但我不能使用 Envers,因为我没有连接到 JDBC 后端)。

因此,为此,我想知道在给定 bean 类的两个实例之间,哪些属性具有不同的值。

更清楚地说,当给定 bean A 和 B 时,我希望有一个方法 ... 说 ... diff(A, B),它将向我输出一个列表(或映射),将属性链接到它们的旧/新值。

就像是

<BeanClass> Collection<Field, Entry<Object, Object> diff(BeanClass a, BeanClass b)

在 Java 世界中是否有一个库可以做到这一点?

4

5 回答 5

4

好吧,解决方案是使用java-object-diff,它提供了对象之间差异的可访问树。结果,我们最终成功地使用了该库。

于 2012-11-09T15:27:55.633 回答
1
于 2012-10-29T13:55:05.323 回答
0

您可以使用 Reflection + Apache Commons BeanUtils。如果您想做深度差异,递归部分将是棘手的部分。

于 2012-10-29T13:50:06.043 回答
0

编辑:当然有很多与反射有关的工作(如其他人所写),这是您应该开始的地方。

顺便说一句,我刚刚找到了一个应该做你正在寻找的项目,只需从存储库中签出主干:

https://code.google.com/p/beandiff/source/checkout

希望有帮助


尝试查看 Apache BeanComparator

此比较器通过指定的 bean 属性比较两个 bean。也可以基于嵌套的、索引的、组合的、映射的 bean 属性来比较 bean。请参阅 PropertyUtilsBean 文档以了解所有可能的属性名称。

compare(java.lang.Object o1, java.lang.Object o2)
          Compare two JavaBeans by their shared property.
于 2012-10-29T13:50:12.563 回答
0

像这样的东西:

public <T> Map<Field, Entry<Object, Object>> diff(T a, T b){
    //... initialize the map
    for (Method m : a.getClass().getMethods()){
        if(m.getName().startsWith("get")){
            Object obj1 = m.invoke(a, null);
            Object obj2 = m.invoke(b, null);
            if(!obj1.equals(obj2)){
                //converts getName to name, for example
                String fieldName = m.getName()...; 
                map.put(a.getClass().getField(fieldName), new Entry(obj1, obj2));
            }
        }
    }
}

考虑到您遵循 Java Beans 约定。

于 2012-10-29T13:55:59.497 回答