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