deepcopy / clone派生类到基类

时间:2012-04-16 07:09:00

标签: java serialization 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 :(得分: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;
}

请注意,您可能希望缓存读/写方法,因为方法调用是同步的。

当我做这样的事情时,我通常会检查一次bean并创建包装这两种方法的辅助对象,这样我就可以像这样工作:

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

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