2012-04-16 114 views
0

如何克隆(複製基類部分)派生類到基類。deepcopy /克隆派生類到基類

在我的情況下,基類是一個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

上溯造型沒有量會幫助你,這純粹是編譯器的東西。另外,這是一個不明確的問題,這意味着你可能找不到一個開箱即用的解決方案。手動操作太麻煩了嗎? – 2012-04-16 07:24:52

+0

爲什麼你需要這樣做,因爲你的'Dervided'是'Base'類?你想達到什麼目的,演員或深層複製不會做? – 2012-04-16 07:40:11

回答

1

確保繼承樹的所有級別都支持Java Bean 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; 
} 

請注意,你可能想緩存讀/寫方法,因爲該方法的調用是同步的。

當我做這樣的東西,我通常檢查豆類一次創建包裹兩種方法輔助對象,所以我能像這樣工作:

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

public Helper[] get(Class<?> type) { 
    ... look in cache. If nothing there, create helper using PropertyDescriptors. 
}