Estoy un poco confundido acerca de la diferencia entre el getFieldsmétodo y el getDeclaredFieldsmétodo cuando uso la reflexión de Java.
Leí que getDeclaredFieldsle da acceso a todos los campos de la clase y que getFieldssolo 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

getFieldpuede obtener un campo heredado de una superclase perogetDeclaredFieldno puede.getDeclaredFieldrestringirse a la clase en la que llama la función.getFieldno puede acceder a miembros privadosRespuestas:
getFields ()
Todos los
publiccampos 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
exclusiveParentclase se proporciona para evitar la recuperación de camposObject. Puede sernullsi quieres losObjectcampos.Para aclarar,
Lists.newArrayListproviene de la guayaba.Actualizar
Para su información, el código anterior se publica en GitHub en mi proyecto LibEx en ReflectionUtils .
fuente
Field#getmé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.setAccessibley no haya un Administrador de seguridad en su lugarprivateque solo se puede acceder a los campos a través de losgetDeclaredFieldscuales es específico de la clase. Cada campo (incluso con el mismo tipo y nombre) seríanFieldinstancias distintas .Como ya se mencionó,
Class.getDeclaredField(String)solo mira los campos desde losClassque lo llama.Si desea buscar
Fielden laClassjerarquía, puede usar esta función simple:Esto es útil para encontrar un
privatecampo 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 SecurityExceptionDevuelve 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 SecurityExceptionDevuelve 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