11
votes

Obtenir les champs des premiers parents via une réflexion

J'essaie d'obtenir les champs et les valeurs du premier parent de mon objet. Mon code actuel est la suivante:

class A
{
    int x;
}

class B extends A
{
    int y;
}

class C extends B
{
    int z;
}


0 commentaires

4 Réponses :


9
votes

Créer une méthode xxx

ou utilisez une boucle xxx


0 commentaires

20
votes

-3
votes

Vous pouvez simplement obtenir des champs de n'importe quelle classe à l'aide de ce code no matmer son parent ou une classe enfant

for (Field field : YourClassName.class.getDeclaredFields()) {
  //fields
}


1 commentaires

Mauvais: Javadoc: retourne une gamme d'objets de terrain reflétant tous les champs déclarés par la classe ou l'interface représentée par cet objet de classe. Cela inclut l'accès public, protégé, par défaut (emballage) et des champs privés, mais exclut les champs hérités



0
votes
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author pablo.barbosa (2017-08-15)
 */
public class ReflectionUtil {

    /**
     * Hiding constructor. The methods are statics
     */
    private ReflectionUtil() {
        // Hiding constructor
    }

    public static List<Field> getInheritedDeclaredFields(Class<?> fromClass, Class<?> stopWhenClass) {
        if (stopWhenClass == null) {
            stopWhenClass = Object.class;
        }
        List<Field> fields = new ArrayList<>();
        List<Class<?>> classes = new ArrayList<>();

        Class<?> cls = fromClass;
        do {
            classes.add(cls);
            cls = cls.getSuperclass();
        } while (cls != null && !cls.equals(stopWhenClass));

        for (int i = classes.size() - 1; i >= 0; i--) {
            fields.addAll(Arrays.asList(classes.get(i).getDeclaredFields()));
        }

        return fields;
    }

    public static Field getInheritedDeclaredField(Class<?> fromClass, String fieldName, Class<?> stopWhenClass) throws NoSuchFieldException {
        if (stopWhenClass == null) {
            stopWhenClass = Object.class;
        }

        Class<?> cls = fromClass;
        do {
            Field field;
            try {
                field = cls.getDeclaredField(fieldName);
                if (field != null) {
                    return field;
                }
            } catch (NoSuchFieldException | SecurityException e) {
                // Nothing. We'll try to get field from superclass
            }
            cls = cls.getSuperclass();
        } while (cls != null && !cls.equals(stopWhenClass));

        // If we got here, we'll throw an exception
        throw new NoSuchFieldException(fieldName);
    }

    public static Object getInheritedDeclaredFieldValue(Object obj, String fieldName, Class<?> stopWhenClass) throws NoSuchFieldException, IllegalAccessException {
        Field field = getInheritedDeclaredField(obj.getClass(), fieldName, stopWhenClass);
        field.setAccessible(true);
        return field.get(obj);
    }

}

1 commentaires

Habituellement, il est préférable de non seulement publier le code avec la réponse. Mais aussi expliquer pourquoi.