csrss Ответов: 1

Задать поле вложенного объекта с помощью отражения


Вот Java-код, который я нашел в сети, чтобы установить значение поля с помощью отражения:
public static boolean setField(Object object, String fieldName, Object fieldValue) {
    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(object, fieldValue);
            return true;
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return false;
}


И это работает. Пока все хорошо. Но теперь я пытаюсь обновить этот код, чтобы поддерживать настройку значений вложенных объектов. Скажем так:
setField(obj, "data.value", 10)


Что я уже пробовал:

Это то, что у меня есть банкомат (ни в коем случае это не окончательная версия):
public boolean setField(Object object, String fieldName, Object fieldValue) {

    String[] fieldChain = fieldName.split(Pattern.quote("."));
    Integer current = 0;

    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldChain[current]);
            field.setAccessible(true);
            if (current < fieldChain.length - 1){
                clazz = field.getType();
                ++current;
            } else {
                field.set(???, fieldValue);
                return true;
            }
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
            current = 0;
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return false;
}

Чего я не знаю, так это того, что должно быть передано в качестве 1-го парама метода field.set:
field.set(???, fieldValue);

Я не могу передать здесь объект верхнего уровня - это должен быть объект нижнего уровня, но я понятия не имею, как его получить.
Я пробовал разные вещи, например: clazz, clazz.newInstance () и т. д. - Но, конечно, это не работает.
Буду признателен за любую помощь.
Заранее спасибо.

1 Ответов

Рейтинг:
1

E.F. Nijboer

Не нужно изобретать велосипед. Вы можете использовать Apache commons lang3 для базовых утилит отражения и использовать commons beanutils для более сложных сценариев, таких как доступ к вложенным свойствам. Смотрите ссылки ниже.

FieldUtils (Apache Commons Lang 3.7 API)[^]

орг."Апач".общин.beanutils (Апач Викискладе BeanUtils 1.9.2 АПИ)[^]

Java BeanUtils Доступ К Вложенным Свойствам[^]

Удачи вам!