2016-12-04 2 views
2

Я пытаюсь скопировать все свойства из одного боба в другой:Эффективный способ скопировать все свойства компонента в другой боб

public void copy(MyBean bean){ 
    setPropertyA(bean.getPropertyA()); 
    setPropertyB(bean.getPropertyB()); 
    [..] 
} 

Это ошибки и много писать, если у вас есть фасоль с большим количеством свойства.

Я думал об отражении, чтобы сделать это, но я не могу «подключить» геттер от одного объекта к сеттеру другого.

public List<Method> getAllGetters(Object object){ 
    List<Method> result = new ArrayList<>(); 
    for (final PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(object.getClass()).getPropertyDescriptors()) { 
    result.add(readMethod = propertyDescriptor.getReadMethod()); 
    } 
    return result; 
} 

Edit:

BeanUtils.copyProperties(this, anotherBean); 

Работы так же, как ожидалось!

+0

И отражение защищено от ошибок? – GurV

+1

@GurwinderSingh, спасибо за этот ценный комментарий. – kerner1000

+0

В некоторых проектах я использовал [Orika] (http://orika-mapper.github.io/orika-docs/intro.html) и [Dozer] (https://github.com/DozerMapper/dozer). Однако я бы пошел с ручными картографами. Это не так сложно, и дело не в этом. Эти инструменты (Orika и Dozer) либо требуют конфигурации, либо делают ваш код зависимым от произвольных соглашений, и, хотя они помогают, я думаю, что цена за него очень высока. –

ответ

5

Рассмотрите возможность использования Apache BeanUtils или Spring's BeanUtils. Они оба имеют метод copyProperties(), который будет делать то, что вы хотите.

Возможно также, что JDK's Object.clone() предоставит вам результаты, которые вам нужны. Обязательно просмотрите Javadoc и this SO post, чтобы вы знали о его ограничениях.

-1

Если вы хотите сделать это вручную, я предлагаю использовать то, что называется «Сериализационная копия». Единственное ограничение состоит в том, что bean-интерфейс наиболее реализует интерфейс Serializable. Как вы говорите, это можно сделать с помощью отражения, но у вас может быть больше неудобств. Надеюсь, что эта помощь.

+0

Это не применимо здесь. Сериализационная копия - это стратегия клонирования/глубокого копирования. Он не применим к взятию одного объекта и копированию его в другой класс. BeanUtils, или сворачивание собственного с отражением, является подходящим вариантом. Единственный способ копирования сериализованной копии может быть полезен здесь, если был определен новый компонент с общими членами, стал членом двух компонентов, и ему были делегированы геттеры и сеттеры, чтобы поддерживать текущий простой интерфейс bean. Затем это можно было бы скопировать. Но это сложнее, чем нужно. –

Смежные вопросы