У меня есть объект Java "ChildObj", который является расширением "ParentObj". Теперь, можно ли получить все имена и значения атрибутов ChildObj, включая унаследованные атрибуты, используя механизм отражения Java?
Class.getFields дает мне массив общедоступных атрибутов, а Class.getDeclaredFields дает мне массив всех полей, но ни одно из них не включает список унаследованных полей.
Есть ли способ получить также унаследованные атрибуты?
java
reflection
introspection
Веера
источник
источник
источник
Если вместо этого вы хотите полагаться на библиотеку для этого, Apache Commons Lang версии 3.2+ предоставляет
FieldUtils.getAllFieldsList
:источник
Вам необходимо позвонить:
При необходимости рекурсивно вверх по иерархии наследования.
источник
Использовать библиотеку отражений:
источник
Рекурсивные решения в порядке, единственная небольшая проблема заключается в том, что они возвращают расширенный набор объявленных и унаследованных членов. Обратите внимание, что метод getDeclaredFields () также возвращает частные методы. Итак, учитывая, что вы перемещаетесь по всей иерархии суперклассов, вы включаете все частные поля, объявленные в суперклассах, и они не наследуются.
Простой фильтр с Modifier.isPublic || Предикат Modifier.isProtected будет делать:
источник
Рабочая версия решения "DidYouMeanThatTomHa ..." выше
источник
С помощью библиотеки spring util вы можете использовать, чтобы проверить, существует ли один конкретный атрибут в классе:
Документ Api:
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/util/ReflectionUtils.html
или
Документ api:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ReflectionUtils.html
@cheers
источник
Можешь попробовать:
источник
Короче и с меньшим количеством объектов? ^^
источник
getFields (): получает все общедоступные поля по всей иерархии классов, а
getDeclaredFields (): получает все поля, независимо от их модификаторов, но только для текущего класса. Итак, вы должны пройти всю вовлеченную иерархию.
Я недавно видел этот код из org.apache.commons.lang3.reflect.FieldUtils
источник
источник
Это переформулировка принятого ответа от @ user1079877. Возможно, это версия, которая не изменяет параметр функции, а также использует некоторые современные возможности Java.
Эта реализация также делает вызов немного более лаконичным:
источник
Есть несколько причуд, которые не решаются FieldUtils - в частности, синтетические поля (например, введенные JaCoCo), а также тот факт, что тип перечисления, конечно, имеет поле для каждого экземпляра, и если вы просматриваете граф объекта, получение все поля, а затем получение полей каждого из них и т.д., тогда вы попадете в бесконечный цикл, когда нажмете перечисление. Расширенное решение (и, честно говоря, я уверен, что оно должно находиться где-то в библиотеке!) Будет:
Тестовый класс в Spock (а Groovy добавляет синтетические поля):
источник