java - 深拷贝/克隆派生类到基类

标签 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

除了手动将所有属性从派生复制到基类之外,还有其他简单的方法吗?

最佳答案

确保继承树的所有级别都支持 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;
}

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

当我做这样的事情时,我通常检查一次 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.
}

关于java - 深拷贝/克隆派生类到基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10169967/

相关文章:

java - 检查 wifi 是否启用和共享首选项

java - MQTT - Paho IMqttMessageLIstener 当监听器线程因操作而被阻止时会丢失消息

java - 将/assets/image.png 转换为 byte[]

java - 自定义序列化 joda LocalDate 的有效方法

php - PHP 阅读中最快的序列化数据格式

git - 克隆 git 存储库时如何自动保留别名?

jquery - 无法拖动对象的克隆 (JQuery)

克隆指向 int 的 void* 指针

java - 摩尔斯转英语程序中的 Java 输出不正确

c++ - 我如何在 C++ 中将 vector 序列化为 char,以便轻松使用 mongodb 作为后端