5

私は、多くの JavaBeans を使用するという不運な状況に陥っています。私はそれらが可変であることを好まないので、残念だと言います。そのため、Bean を作成した後 (Jackson を使用して JSON から変換しています)、特定の時点で Bean を「フリーズ」して、途中で変更されないようにしたいと考えています。

私には、すべての Bean の Mutable/Immutable バージョンやカスタム Jackson ファクトリを作成する能力がないため、Bean 以外のライブラリまたは関数呼び出しを探していますCollections.unmodifiableCollection(...);

(はい、元の Bean が漏れた場合、それが本当に凍結されていないことはわかっています。しかし、作成後すぐにラップまたは凍結し、元の Bean は二度と使用しません。)

何か案は?

4

2 に答える 2

3

「java Beans jackson immutable」で検索すると、Google がこれを見つけました。

http://www.cowtowncoder.com/blog/archives/2010/08/entry_409.html

それが機能するかどうかはわかりませんが、記事ではそれができると主張しています。

于 2012-10-20T00:58:26.677 に答える
3

あなたはBeanインターフェースベースですか、それともpojosですか?インターフェイスベースの場合は、単純にユーティリティ メソッドを記述できます。

public class ImmutableBean {
    public static <T> T makeImmutable(T t) { ... }
}

次に、Bean に固有の java.lang.Proxy インスタンスを作成するか、「set」で始まるメソッドのようなパターンを探して、特定の例外をスローします。プロキシ インスタンスの作成に関する短いチュートリアルを次に示します: http://www.javalobby.org/java/forums/t18631.html

それらが pojo の場合、javassist や cglib などのライブラリを使用して、セッターがスタブ化されて例外をスローする拡張バージョンを作成できるはずです。

javassist の例を次に示します。

 public static <T> T makeImmutable(final T t) throws NotFoundException, InstantiationException, IllegalAccessException {
    MethodHandler mh = new MethodHandler() {
        @Override
        public Object invoke(java.lang.Object self, java.lang.reflect.Method thisMethod, java.lang.reflect.Method proceed, java.lang.Object[] args) throws Throwable {
            if (thisMethod.getName().startsWith("set")) {
                throw new UnsupportedOperationException();
            }
            return proceed.invoke(t, args);
        }

    };

    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.setSuperclass(t.getClass());
    Class<T> clazz = (Class<T>) proxyFactory.createClass();
    T instance = clazz.newInstance();
    ((ProxyObject)instance).setHandler(mh);

    return instance;

}

ただし、これには元のクラスに引数なしのコンストラクターが必要になるため、引数なしのコンストラクターがない場合は、クラスに対して特定のメソッドを実行する必要がある場合があります。

于 2012-10-20T01:16:57.200 に答える