В чём разница между методами getFields() и getDeclaredFields() в Java

Метод getFields() возвращает массив (Field[]) всех публичных полей по всей иерархии наследования.

Метод getDeclaredFields() возвращает массив (Field[]) вообще всех, в том числе приватных полей, но только данного класса. Если нужны поля предков, то можно воспользоваться замечательным методом со стэковерфлоу (модифицированная версия, где убраны лишние зависимости):

public static List<Field> getFieldsUpTo(Class<?> startClass, Class<?> exclusiveParent) {


if (startClass == null) return null;


List<Field> currentClassFields = new ArrayList<>(Arrays.asList(startClass.getDeclaredFields()));

Class<?> parentClass = startClass.getSuperclass();


if (parentClass != null && (exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) {

List<Field> parentClassFields = (List<Field>) getFieldsUpTo(parentClass, exclusiveParent);

currentClassFields.addAll(parentClassFields);

}


return currentClassFields;

}