Estoy un poco confundido acerca de la diferencia entre el getFields
método y el getDeclaredFields
método cuando uso 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 lo usarías siempre getDeclaredFields
?
¿Alguien puede explicar esto y explicar la diferencia entre los dos métodos y cuándo / por qué querría usar uno sobre el otro?
java
reflection
BlackHatSamurai
fuente
fuente
getField
puede obtener un campo heredado de una superclase perogetDeclaredField
no puede.getDeclaredField
restringirse a la clase en la que llama la función.getField
no puede acceder a miembros privadosRespuestas:
getFields ()
Todos los
public
campos ocupan toda la jerarquía de clases.getDeclaredFields ()
Todos los campos, independientemente de su accesibilidad pero solo para la clase actual, no ninguna clase base de la que la clase actual podría estar heredando.
Para subir todos los campos a la jerarquía, he escrito la siguiente función:
La
exclusiveParent
clase se proporciona para evitar la recuperación de camposObject
. Puede sernull
si quieres losObject
campos.Para aclarar,
Lists.newArrayList
proviene de la guayaba.Actualizar
Para su información, el código anterior se publica en GitHub en mi proyecto LibEx en ReflectionUtils .
fuente
Field#get
métodos similares. En otras palabras, este enfoque no permite el acceso de la clase actual a la interfaz privada de su superclase, de la misma manera que la compilación típica no lo hace.setAccessible
y no haya un Administrador de seguridad en su lugarprivate
que solo se puede acceder a los campos a través de losgetDeclaredFields
cuales es específico de la clase. Cada campo (incluso con el mismo tipo y nombre) seríanField
instancias distintas .Como ya se mencionó,
Class.getDeclaredField(String)
solo mira los campos desde losClass
que lo llama.Si desea buscar
Field
en laClass
jerarquía, puede usar esta función simple:Esto es útil para encontrar un
private
campo de una superclase, por ejemplo. Además, si desea modificar su valor, puede usarlo así:fuente
try try { field = clazz.getDeclaredField(name); } catch (NoSuchFieldException e) { clazz = clazz.getSuperclass(); if(clazz==null){ throw e; } }
public Field[] getFields() throws SecurityException
Devuelve una matriz que contiene objetos Field que reflejan todos los campos públicos accesibles de la clase o interfaz representada por este objeto Class. Los elementos en la matriz devuelta no están ordenados y no están en ningún orden en 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 las matrices.
public Field[] getDeclaredFields() throws SecurityException
Devuelve una matriz de objetos Field que reflejan todos los campos declarados por la clase o interfaz representada por este objeto Class. Esto incluye acceso público, protegido, predeterminado (paquete) y campos privados , pero excluye los campos heredados . Los elementos en la matriz devuelta no están ordenados y no están en ningún orden en particular. Este método devuelve una matriz de longitud 0 si la clase o interfaz declara que no hay campos, o si este objeto de clase representa un tipo primitivo, una clase de matriz o vacío.
¿Y si necesito todos los campos de todas las clases para padres? Se necesita algún código, por ejemplo, de https://stackoverflow.com/a/35103361/755804 :
fuente
De los tutoriales de Java Reflection :
fuente