2012-04-16 113 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. 
}