2012-04-16 18 views
0

派生クラスを基底クラスにどのようにクローン化(基本クラスの部分をコピー)できますか。deepcopy/cloneの基底クラスへの継承

私の場合、基本クラスは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 

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

+1

アップキャストのいかなる量があなたを助けるために起こっていない、これを純粋にコンパイラのものです。さらに、一般的にはあまり定義されていない問題です。つまり、すぐに使えるソリューションは見つけられません。手動で行うのはあまりにも苦痛でしょうか? –

+0

あなたは 'Dervided'が' Base'クラスであるため、なぜこれを行う必要がありますか?キャストやディープ・コピーができないことを達成しようとしているのは何ですか? –

答えて

1

継承ツリーのすべてのレベルがJava Beans APIをサポートしていることを確認してください。あなたがメソッドの呼び出しが同期しているため、読み取り/書き込みメソッドをキャッシュする場合があります

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; 
} 

注:今、あなたは、このような特定のレベルのクローナーを書くことができます。

私はこのようなものを行うとき、私は通常、一度豆を調べて、私はこのような仕事ができるように、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. 
} 
関連する問題