2012-04-16 4 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

Убедитесь, что все уровни дерева наследования поддерживают API Java Beans. Теперь вы можете написать определенный уровне Cloner так:

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. 
} 
Смежные вопросы