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; }
4 Réponses :
Créer une méthode ou utilisez une boucle p>
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 }
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 i>
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); } }
Habituellement, il est préférable de non seulement publier le code avec la réponse. Mais aussi expliquer pourquoi.