example definicion java reflection

definicion - ¿Cuál es la diferencia entre getFields y getDeclaredFields en la reflexión de Java?



class<t> java (3)

getFields ()

Todos los campos public suben por toda la jerarquía de clases.

getDeclaredFields ()

Todos los campos, independientemente de su accesibilidad pero solo para la clase actual, no de las clases base de las que la clase actual pueda estar heredando.

Para obtener todos los campos en la jerarquía

He escrito la siguiente función:

public static Iterable<Field> getFieldsUpTo(@Nonnull Class<?> startClass, @Nullable Class<?> exclusiveParent) { List<Field> currentClassFields = Lists.newArrayList(startClass.getDeclaredFields()); Class<?> parentClass = startClass.getSuperclass(); if (parentClass != null && (exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) { List<Field> parentClassFields = (List<Field>) getFieldsUpTo(parentClass, exclusiveParent); currentClassFields.addAll(parentClassFields); } return currentClassFields; }

La clase exclusiveParent Parent se proporciona para evitar la recuperación de campos de Object . Puede ser null si DESEA los campos de Object .

Para aclarar, Lists.newArrayList viene de Guava.

Actualizar

FYI, el código anterior está publicado en GitHub en mi proyecto LibEx en ReflectionUtils .

Estoy un poco confundido acerca de la diferencia entre el método getFields y el método getDeclaredFields cuando getDeclaredFields la reflexión de Java.

Leí que getDeclaredFields le da acceso a todos los campos de la clase y que getFields solo devuelve campos públicos. Si este es el caso, ¿por qué no siempre getDeclaredFields ?

¿Puede alguien explicar esto y explicar la diferencia entre los dos métodos, y cuándo / por qué querría usar uno sobre el otro?


Como ya se mencionó, Class.getDeclaredField(String) solo mira los campos de la Class en la que lo llama.

Si desea buscar un Field en la jerarquía de Class , puede usar esta sencilla función:

/** * Returns the first {@link Field} in the hierarchy for the specified name */ public static Field getField(Class<?> clazz, String name) { Field field = null; while (clazz != null && field == null) { try { field = clazz.getDeclaredField(name); } catch (Exception e) { } clazz = clazz.getSuperclass(); } return field; }

Esto es útil para encontrar un campo private de una superclase, por ejemplo. Además, si desea modificar su valor, puede usarlo así:

/** * Sets {@code value} to the first {@link Field} in the {@code object} hierarchy, for the specified name */ public static void setField(Object object, String fieldName, Object value) throws Exception { Field field = getField(object.getClass(), fieldName); field.setAccessible(true); field.set(object, value); }


public Field[] getFields() throws SecurityException

Devuelve una matriz que contiene objetos de campo que reflejan todos los campos públicos accesibles de la clase o interfaz representada por este objeto de Clase. Los elementos en la matriz devuelta no están ordenados y no están en ningún orden particular. Este método devuelve una matriz de longitud 0 si la clase o interfaz no tiene campos públicos accesibles, o si representa una clase de matriz, un tipo primitivo o nulo.

Específicamente, si este objeto de Clase representa una clase, este método devuelve los campos públicos de esta clase y de todas sus superclases. Si este objeto de Clase representa una interfaz, este método devuelve los campos de esta interfaz y de todas sus superinterfaces.

El campo de longitud implícita para la clase de matriz no se refleja en este método. El código de usuario debe usar los métodos de la clase Array para manipular matrices.


public Field[] getDeclaredFields() throws SecurityException

Devuelve una matriz de objetos de Campo que refleja todos los campos declarados por la clase o interfaz representada por este objeto de Clase. Esto incluye acceso público, protegido, predeterminado (paquete) y campos privados , pero excluye campos heredados . Los elementos en la matriz devuelta no están ordenados y no están en ningún orden particular. Este método devuelve una matriz de longitud 0 si la clase o interfaz declara no campos, o si este objeto de Clase representa un tipo primitivo, una clase de matriz o nulo.


¿Y si necesito todos los campos de todas las clases para padres? Se necesita algún código, por ejemplo, de https://.com/a/35103361/755804 :

public static List<Field> getAllModelFields(Class aClass) { List<Field> fields = new ArrayList<>(); do { Collections.addAll(fields, aClass.getDeclaredFields()); aClass = aClass.getSuperclass(); } while (aClass != null); return fields; }