Encontré una manera de obtener miembros heredados class.getDeclaredFields();
y acceso a miembros privados a través de class.getFields()
Pero estoy buscando campos heredados privados. ¿Cómo puedo conseguir esto?
109
Encontré una manera de obtener miembros heredados class.getDeclaredFields();
y acceso a miembros privados a través de class.getFields()
Pero estoy buscando campos heredados privados. ¿Cómo puedo conseguir esto?
Respuestas:
Esto debería demostrar cómo resolverlo:
(O
Class.getDeclaredFields
para una matriz de todos los campos).Salida:
fuente
getSuperclass()
hasta llegar anull
si desea ir más alto.getDeclaredFields()[0]
ogetDeclaredField("i")
repite el[0]
acceso a la matriz en las siguientes dos declaraciones?getDeclaredFields
. La respuesta se ha actualizado.El mejor enfoque aquí es usar el Patrón de visitante para encontrar todos los campos de la clase y todas las superclases y ejecutar una acción de devolución de llamada en ellos.
Implementación
Spring tiene una buena clase de utilidad
ReflectionUtils
que hace precisamente eso: define un método para recorrer todos los campos de todas las superclases con una devolución de llamada:ReflectionUtils.doWithFields()
Documentación:
Código de muestra:
Salida:
fuente
Esto lo hará:
Si usa una herramienta de cobertura de código como EclEmma , debe tener cuidado: agregan un campo oculto a cada una de sus clases. En el caso de EclEmma, estos campos están marcados como sintéticos y puede filtrarlos así:
fuente
(basado en esta respuesta)
fuente
De hecho, utilizo una jerarquía de tipos complejos, por lo que su solución no está completa. Necesito hacer una llamada recursiva para obtener todos los campos heredados privados. Aqui esta mi solucion
fuente
Necesitaba agregar soporte para campos heredados para planos en Model Citizen . Derivé este método que es un poco más conciso para recuperar los campos de una clase + campos heredados.
fuente
fuente