Скопируйте все значения с полей в одном классе другому посредством отражения

Вы загрузили набор данных и ярлыки с официального сайта Coco, если вы это сделаете, следуйте комментариям в файле py

"""
Example usage:
    python create_coco_tf_record.py --logtostderr \
      --train_image_dir="${TRAIN_IMAGE_DIR}" \
      --val_image_dir="${VAL_IMAGE_DIR}" \
      --test_image_dir="${TEST_IMAGE_DIR}" \
      --train_annotations_file="${TRAIN_ANNOTATIONS_FILE}" \
      --val_annotations_file="${VAL_ANNOTATIONS_FILE}" \
      --testdev_annotations_file="${TESTDEV_ANNOTATIONS_FILE}" \
      --output_dir="${OUTPUT_DIR}"
"""
73
задан Joe 15 November 2011 в 09:34
поделиться

5 ответов

Если вы не против использования сторонней библиотеки, BeanUtils от Apache Commons справится с этим довольно легко, используя copyProperties (Object, Object) .

.
84
ответ дан 24 November 2019 в 12:18
поделиться

Основная идея Mladen работала (благодарит), но нуждался в нескольких изменениях, чтобы быть устойчивым, таким образом, я внес их здесь.

единственное место, где этот тип решения должен использоваться, - то, если Вы хотите клонировать объект, но не можете, потому что это - управляемый объект. Если Вам повезло иметь объекты, что у всех есть 100%-й побочный эффект свободные методы set для всех полей, необходимо определенно использовать опцию BeanUtils вместо этого.

Здесь, я использую служебные методы lang3 упростить код, поэтому если Вы вставляете его, необходимо сначала импортировать lang3 библиотеку Apache.

код Копии

static public <X extends Object> X copy(X object, String... skipFields) {
        Constructor constructorToUse = null;
        for (Constructor constructor : object.getClass().getConstructors()) {
            if (constructor.getParameterTypes().length == 0) {
                constructorToUse = constructor;
                constructorToUse.setAccessible(true);
                break;
            }
        }
        if (constructorToUse == null) {
            throw new IllegalStateException(object + " must have a zero arg constructor in order to be copied");
        }
        X copy;
        try {
            copy = (X) constructorToUse.newInstance();

            for (Field field : FieldUtils.getAllFields(object.getClass())) {
                if (Modifier.isStatic(field.getModifiers())) {
                    continue;
                }

                //Avoid the fields that you don't want to copy. Note, if you pass in "id", it will skip any field with "id" in it. So be careful.
                if (StringUtils.containsAny(field.getName(), skipFields)) {
                    continue;
                }

                field.setAccessible(true);

                Object valueToCopy = field.get(object);
                //TODO add here other special types of fields, like Maps, Lists, etc.
                field.set(copy, valueToCopy);

            }

        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            throw new IllegalStateException("Could not copy " + object, e);
        }
        return copy;
}
0
ответ дан 24 November 2019 в 12:18
поделиться

Dozer

ОБНОВЛЕНИЕ 19 ноября 2012 г .: Также появился новый проект ModelMapper .

4
ответ дан 24 November 2019 в 12:18
поделиться

Да, или BeanUtils из Apache Jakarta.

1
ответ дан 24 November 2019 в 12:18
поделиться

Первым аргументом tooF.set () должен быть целевой объект ( тоже ), а не поле, а второй аргумент должен быть значение , а не поле, из которого взято значение. (Чтобы получить значение, вам нужно вызвать fromF.get () - снова передав целевой объект, в данном случае из .)

Большая часть API отражения работает так. Вы получаете объекты Поле , объекты метода и так далее из класса, а не из экземпляра, поэтому для их использования (кроме статики) вам обычно необходимо передать им экземпляр.

4
ответ дан 24 November 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: