Получение имен / значений унаследованных атрибутов с использованием Java Reflection - PullRequest
112 голосов
/ 25 июня 2009

У меня есть Java-объект ChildObj, который расширен от ParentObj. Теперь, если возможно извлечь все имена и значения атрибутов ChildObj, включая унаследованные атрибуты, используя механизм отражения Java?

Class.getFields дает мне массив открытых атрибутов, а Class.getDeclaredFields дает мне массив всех полей, но ни одно из них не включает список унаследованных полей.

Есть ли способ также получить унаследованные атрибуты?

Ответы [ 12 ]

0 голосов
/ 20 января 2019

Это переформулировка принятого ответа от @ user1079877. Возможно, это версия, которая не изменяет параметр функции, а также использует некоторые современные функции Java.

public <T> Field[] getFields(final Class<T> type, final Field... fields) {
    final Field[] items = Stream.of(type.getDeclaredFields(), fields).flatMap(Stream::of).toArray(Field[]::new);
    if (type.getSuperclass() == null) {
        return items;
    } else {
        return getFields(type.getSuperclass(), items);
    }
}

Эта реализация также делает вызов немного более кратким:

var fields = getFields(MyType.class);
0 голосов
/ 09 марта 2010
private static void addDeclaredAndInheritedFields(Class c, Collection<Field> fields) {
    fields.addAll(Arrays.asList(c.getDeclaredFields()));
    Class superClass = c.getSuperclass();
    if (superClass != null) {
        addDeclaredAndInheritedFields(superClass, fields);
    }
}
...