2012-10-29 33 views
3

我想以与Hibernate Envers类似的方式坚持对我的bean所做的更改(但我无法使用Envers,因为我没有连接到JDBC后端)。所以,我想知道,在给定的bean类的两个实例之间,哪些属性具有不同的值。有没有办法知道两个bean之间哪些属性不同?

为了更加清楚,当给出bean A和B时,我想要一个方法...说... diff(A, B),它会输出一个链接属性到它们的旧/新值的列表(或映射) 。

喜欢的东西

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

是否有一个库做的是,在Java世界?

+0

我认为这可以通过反射轻松完成。 – elias

+1

你见过这个线程吗? http://stackoverflow.com/questions/578209/common-algorithm-for-generating-a-diff-of-the-fields-in-two-beans –

回答

2

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

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. 
+0

那么,这个只是告诉我他们是如何比较,**不是**他们的价值有哪些不同。 – Riduidel

0

可以使用EqulasBuilder class from Apache Commons

String[] Arr = new String[excludedFields.size()]; //Add fields you want to exclude in here 

boolean result = EqualsBuilder.reflectionEquals(object2, object1,Arr); 

if(!result){ 
    System.out.println("----- Failure:" + StringUtils.difference(ReflectionToStringBuilder.toStringExclude(object1,excludedFields),ReflectionToStringBuilder.toStringExclude(object2,excludedFields))); 
    return false; 
} 
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 Bean约定。

相关问题