Tengo un objeto Java 'ChildObj' que se extiende desde 'ParentObj'. Ahora, si es posible recuperar todos los nombres y valores de atributos de ChildObj, incluidos los atributos heredados también, utilizando el mecanismo de reflexión de Java.
Class.getFields me da la matriz de atributos públicos, y Class.getDeclaredFields me da la matriz de todos los campos, pero ninguno de ellos incluye la lista de campos heredados.
¿Hay alguna forma de recuperar los atributos heredados también?
java
reflection
introspection
Veera
fuente
fuente
fuente
Si, en cambio, desea confiar en una biblioteca para lograr esto, Apache Commons Lang versión 3.2+ proporciona
FieldUtils.getAllFieldsList
:fuente
Necesitas llamar a:
Recurrir a la jerarquía de herencia según sea necesario.
fuente
Use la biblioteca Reflections:
fuente
Las soluciones recursivas están bien, el único pequeño problema es que devuelven un superconjunto de miembros declarados y heredados. Tenga en cuenta que el método getDeclaredFields () devuelve también métodos privados. Entonces, dado que navega por toda la jerarquía de superclases, incluirá todos los campos privados declarados en las superclases, y esos no se heredarán.
Un filtro simple con Modifier.isPublic || El predicado Modifier.isProtected haría:
fuente
Versión de trabajo de la solución "DidYouMeanThatTomHa ..." arriba
fuente
Con la biblioteca Spring Util, puede usar para verificar si existe un atributo específico en la clase:
Documento de la API:
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/util/ReflectionUtils.html
o
Documento de la API:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ReflectionUtils.html
@salud
fuente
Puedes probar:
fuente
¿Más corto y con menos objeto instanciado? ^^
fuente
getFields (): Obtiene todos los campos públicos en toda la jerarquía de clases y
getDeclaredFields (): Obtiene todos los campos, independientemente de sus modificadores, pero solo para la clase actual. Por lo tanto, debe obtener toda la jerarquía involucrada.
Hace poco vi este código de org.apache.commons.lang3.reflect.FieldUtils
fuente
fuente
Esta es una nueva redacción de la respuesta aceptada por @ user1079877. Es posible que una versión que no modifica un parámetro de la función y también utiliza algunas características modernas de Java.
Esta implementación también hace que la invocación sea un poco más concisa:
fuente
Hay un par de peculiaridades que FieldUtils no aborda, específicamente campos sintéticos (por ejemplo, inyectados por JaCoCo) y también el hecho de que un tipo de curso tiene un campo para cada instancia, y si está atravesando un gráfico de objeto, obtiene todos los campos y luego obtener los campos de cada uno de ellos, etc., entonces entrarás en un bucle infinito cuando toques una enumeración. Una solución extendida (y para ser honesto, estoy seguro de que debe vivir en una biblioteca en algún lugar) sería:
Clase de prueba en Spock (y Groovy agrega campos sintéticos):
fuente