4

Hibernate Enversと同様の方法でBeanに加えられた変更を保持したいと思います(ただし、JDBCバックエンドに接続していないため、Enversを使用できません)。

したがって、そのために、特定のBeanクラスの2つのインスタンス間で、どのプロパティの値が異なるかを知りたいと思います。

より明確にするために、Bean AとBが与えられたときに、diff(A, B)プロパティを古い値/新しい値にリンクするリスト(またはマップ)を出力するメソッド... say...が必要です。

何かのようなもの

<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

ApacheCommonsのEqulasBuilderクラスを使用できます。

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;
}
于 2012-10-29T13:55:05.323 に答える
0

Reflection + ApacheCommonsBeanUtilsを使用できます。再帰的な部分は、深い差分を実行したい場合に備えて、トリッキーな部分になります。

于 2012-10-29T13:50:06.043 に答える
0

編集:もちろん、(他の人が書いたように)リフレクションに関係する作業はたくさんあります。ここから始めるべきです。

ちなみに、私はあなたが探していることを実行するはずのプロジェクトを見つけました。リポジトリからトランクをチェックアウトするだけです。

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

お役に立てば幸い


ApacheBeanComparatorを調べてみてください;

このコンパレータは、指定されたBeanプロパティによって2つの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));
            }
        }
    }
}

JavaBeansの規則に従うことを考慮してください。

于 2012-10-29T13:55:59.497 に答える