Я нашел способ получить унаследованные члены через class.getDeclaredFields();
частные члены и получить доступ к ним через class.getFields()
Но я ищу частные унаследованные поля. Как я могу этого добиться?
109
Я нашел способ получить унаследованные члены через class.getDeclaredFields();
частные члены и получить доступ к ним через class.getFields()
Но я ищу частные унаследованные поля. Как я могу этого добиться?
Ответы:
Это должно продемонстрировать, как ее решить:
(Или
Class.getDeclaredFields
для массива всех полей.)Вывод:
источник
getSuperclass()
пока не достигнете,null
если хотите подняться выше.getDeclaredFields()[0]
или,getDeclaredField("i")
скорее, повторить[0]
доступ к массиву в следующих двух операторах?getDeclaredFields
. Ответ обновлен.Лучшим подходом здесь является использование шаблона посетителя, чтобы найти все поля в классе и все суперклассы и выполнить для них действие обратного вызова.
Реализация
Spring имеет хороший класс Utility,
ReflectionUtils
который делает именно это: он определяет метод для цикла по всем полям всех суперклассов с помощью обратного вызова:ReflectionUtils.doWithFields()
Документация:
Образец кода:
Вывод:
источник
Это сделает это:
Если вы используете инструмент покрытия кода, такой как EclEmma , вы должны быть осторожны : они добавляют скрытое поле в каждый из ваших классов. В случае EclEmma эти поля помечены как синтетические , и вы можете отфильтровать их следующим образом:
источник
(на основе этого ответа)
источник
На самом деле я использую иерархию сложного типа, поэтому ваше решение не является полным. Мне нужно сделать рекурсивный вызов, чтобы получить все унаследованные частные поля. Вот мое решение
источник
Мне нужно было добавить поддержку унаследованных полей для чертежей в Model Citizen . Я получил этот метод, который является немного более кратким для получения полей класса + унаследованных полей.
источник
источник