25 июн. 2009 г., 11:11 отVeera

Получение имен / значений унаследованных атрибутов с использованием Java Reflection

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

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

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

Ответы на вопрос(12)

17 февр. 2011 г., 22:51 отTheo Platt
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); 
    }       
}

24 дек. 2011 г., 12:45 отMarek Dec

единственная небольшая проблема заключается в том, что они возвращают расширенный набор объявленных и унаследованных членов. Обратите внимание, что метод getDeclaredFields () возвращает также закрытые методы. Таким образом, учитывая, что вы перемещаетесь по всей иерархии суперклассов, вы включаете все частные поля, объявленные в суперклассах, и эти поля не наследуются.

Простой фильтр с Modifier.isPublic || Предикат Modifier.isProtected будет делать:

import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isProtected;

(...)

List<Field> inheritableFields = new ArrayList<Field>();
for (Field field : type.getDeclaredFields()) {
    if (isProtected(field.getModifiers()) || isPublic(field.getModifiers())) {
       inheritableFields.add(field);
    }
}
01 февр. 2019 г., 22:53 отaman

org.apache.commons.lang3.reflect.FieldUtils

public static List<Field> getAllFieldsList(final Class<?> cls) {
        Validate.isTrue(cls != null, "The class must not be null");
        final List<Field> allFields = new ArrayList<>();
        Class<?> currentClass = cls;
        while (currentClass != null) {
            final Field[] declaredFields = currentClass.getDeclaredFields();
            Collections.addAll(allFields, declaredFields);
            currentClass = currentClass.getSuperclass();
        }
        return allFields;
}
19 янв. 2019 г., 22:36 отscrutari

это версия, которая не изменяет параметр функции, а также использует некоторые современные функции 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);
28 мая 2014 г., 17:27 отChris

ой цели,Apache Commons Lang версия 3.2+ предоставляетFieldUtils.getAllFieldsList:

import java.lang.reflect.Field;
import java.util.AbstractCollection;
import java.util.AbstractList;
import java.util.AbstractSequentialList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Assert;
import org.junit.Test;

public class FieldUtilsTest {

    @Test
    public void testGetAllFieldsList() {

        // Get all fields in this class and all of its parents
        final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class);

        // Get the fields form each individual class in the type's hierarchy
        final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields());
        final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields());
        final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields());
        final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields());

        // Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents 
        Assert.assertTrue(allFields.containsAll(allFieldsClass));
        Assert.assertTrue(allFields.containsAll(allFieldsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent));
    }
}
25 июн. 2009 г., 11:18 отManuel Selva

   Class parentClass = getClass().getSuperclass();
   if (parentClass != null) {
      parentClass.getDeclaredFields();
   }
10 сент. 2017 г., 16:24 отEsko Luontola
    public static List<Field> getAllFields(Class<?> type) {
        List<Field> fields = new ArrayList<Field>();
        for (Class<?> c = type; c != null; c = c.getSuperclass()) {
            fields.addAll(Arrays.asList(c.getDeclaredFields()));
        }
        return fields;
    }
20 янв. 2016 г., 23:33 отcodewandlerDidYouMeanThatTomHawtin
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);
    }
}
27 авг. 2014 г., 13:37 отBurkhardNick Holt

Вам нужно позвонить:

Class.getSuperclass().getDeclaredFields()

Пересматривая иерархию наследования по мере необходимости.

22 мар. 2017 г., 09:40 отuser1079877dfa

ты должен написать это сам. Это простой рекурсивный метод, вызываемыйClass.getSuperClass ():

public static List<Field> getAllFields(List<Field> fields, Class<?> type) {
    fields.addAll(Arrays.asList(type.getDeclaredFields()));

    if (type.getSuperclass() != null) {
        getAllFields(fields, type.getSuperclass());
    }

    return fields;
}

@Test
public void getLinkedListFields() {
    System.out.println(getAllFields(new LinkedList<Field>(), LinkedList.class));
}
10 июн. 2016 г., 12:23 отLukasz Ochmanski

public Set<Field> getAllFields(Class<?> aClass) {
    return org.reflections.ReflectionUtils.getAllFields(aClass);
}
07 мая 2015 г., 17:17 отAlexis LEGROS

private static Field[] getAllFields(Class<?> type) {
    if (type.getSuperclass() != null) {
        return (Field[]) ArrayUtils.addAll(getAllFields(type.getSuperclass()), type.getDeclaredFields());
    }
    return type.getDeclaredFields();
}

ВАШ ОТВЕТ НА ВОПРОС