0

派生クラスを基本クラスに複製 (基本クラスの部分をコピー) するにはどうすればよいですか。

私の場合、基本クラスはJPAエンティティであり、派生クラスにはswing/ui用のものがあります。gson/json シリアライゼーションによるクローンは機能するはずですが、それには別の問題があります。

Base d=new Derived();
Base b=(Base) SerializationUtils.clone(d);
System.out.println(b.getClass().getSimpleName());   //-->Derived
   //hibernateSession.save(b) -> refers to derived class

すべてのプロパティを派生からベースに手動でコピーする以外に簡単な方法はありますか?

4

1 に答える 1

1

継承ツリーのすべてのレベルがJavaBeansAPIをサポートしていることを確認してください。これで、次のような特定のレベルのクローン作成者を作成できます。

public <T> T specialClone( T obj, Class<T> type ) {
    T result = type.newInstance();
    Class<?> current = type;
    while( current != null ) {
        BeanInfo info = Introspector.getBeanInfo( current );
        for( PropertyDescriptor pd: info.getPropertyDescriptors() ) {
            Object value = pd.getReadMethod().invoke( obj );
            pd.getWriteMethod().invoke( result, value );
        }
        current = current.getSuperClass();
    }
    return result;
}

メソッド呼び出しは同期されているため、読み取り/書き込みメソッドをキャッシュしたい場合があることに注意してください。

このようなことをするとき、私は通常、Beanを一度調べて、2つのメソッドをラップするヘルパーオブジェクトを作成するので、次のように作業できます。

for( Helper h : get( current ) ) {
    h.copy( obj, result );
}

public Helper[] get( Class<?> type ) {
    ... look in cache. If nothing there, create helper using  PropertyDescriptors.
}
于 2012-04-16T08:57:29.980 に答える