Задать поле вложенного объекта с помощью отражения
Вот 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 () и т. д. - Но, конечно, это не работает.
Буду признателен за любую помощь.
Заранее спасибо.