Чтобы вызвать field.get(instance)
, вам нужен экземпляр instance
типа, который объявляет поле.Таким образом, для каждого уровня вложенности, для которого вы получаете список полей, вам также необходимо получить соответствующий список значений полей.Это проще объяснить без цикла, но как только он будет работать для первого поля на каждом уровне вложенности, будет легко воссоздать итерацию из приведенного ниже примера, который предполагает следующую адаптированную структуру для простоты:
class PrimaryClass {
MyClass cls = new MyClass();
String str = "foo";
}
class MyClass {
String value= "test";
}
На верхнем уровне у нас есть ваш основной экземпляр:
PrimaryClass primaryObject = new PrimaryClass();
Field[] primaryObjectFields = primaryObject.getClass().getDeclaredFields();
Для обработки первого поля мы получаем и тип поля и его значение:
Class<?> primaryObjectField1Type = primaryObjectFields[0].getType();
Object primaryObjectField1Value = primaryObjectFields[0].get(primaryObject);
Обратите внимание, как получить значение поля, нам нужно было передать ссылку на экземпляр (primaryObject
) класса, который объявил поля primaryObjectFields
.Мы просто делаем это для каждого уровня вложенности:
Field[] myClassObjectFields = primaryObjectField1Type.getDeclaredFields();
Class<?> myClassObjectField1Type = myClassObjectFields[0].getType();
Object myClassObjectField1Value = myClassObjectFields[0].get(primaryObjectField1Value);
Обратите внимание, как теперь экземпляр, который мы передаем для получения, равен primaryObjectField1Value
, который является экземпляром MyClass
, который объявляет поле value
.
В общем, решение вашей проблемы состоит в том, чтобы получить значения полей вместе с их типом и передать эти значения в Field.get
.