Eu tenho um objeto Java 'ChildObj' que é estendido de 'ParentObj'. Agora, se é possível recuperar todos os nomes e valores de atributos de ChildObj, incluindo também os atributos herdados, usando o mecanismo de reflexão Java?
Class.getFields fornece a matriz de atributos públicos e Class.getDeclaredFields fornece a matriz de todos os campos, mas nenhum deles inclui a lista de campos herdados.
Existe alguma maneira de recuperar os atributos herdados também?
java
reflection
introspection
Veera
fonte
fonte
fonte
Se, em vez disso, você quis contar com uma biblioteca para fazer isso, o Apache Commons Lang versão 3.2+ fornece
FieldUtils.getAllFieldsList
:fonte
Você precisa ligar para:
Recursando a hierarquia de herança, conforme necessário.
fonte
Use a biblioteca de Reflexões:
fonte
As soluções recursivas estão OK, o único pequeno problema é que elas retornam um superconjunto de membros declarados e herdados. Observe que o método getDeclaredFields () retorna também métodos privados. Portanto, considerando que você navega por toda a hierarquia da superclasse, incluirá todos os campos particulares declarados nas superclasses e esses não serão herdados.
Um filtro simples com um Modifier.isPublic || O predicado Modifier.isProtected faria:
fonte
Versão de trabalho da solução "DidYouMeanThatTomHa ..." acima
fonte
Com a biblioteca util do spring, você pode usar para verificar se existe um atributo específico na classe:
Api doc:
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/util/ReflectionUtils.html
ou
Api doc:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ReflectionUtils.html
@Felicidades
fonte
Podes tentar:
fonte
Mais curto e com menos objeto instanciado? ^^
fonte
getFields (): Obtém todos os campos públicos em toda a hierarquia de classes e
getDeclaredFields (): Obtém todos os campos, independentemente de seus modificadores, mas apenas para a classe atual. Então, você precisa obter toda a hierarquia envolvida.
Vi recentemente esse código em org.apache.commons.lang3.reflect.FieldUtils
fonte
fonte
Esta é uma reformulação da resposta aceita por @ user1079877. Pode ser que uma versão que não modifique um parâmetro da função e também use alguns recursos Java modernos.
Essa implementação também torna a chamada um pouco mais concisa:
fonte
Existem algumas peculiaridades que não são tratadas pelo FieldUtils - especificamente campos sintéticos (por exemplo, injetados pela JaCoCo) e também o fato de que um tipo de enum possui um campo para cada instância e, se você estiver percorrendo um gráfico de objeto, obtém todos os campos e, em seguida, obtendo os campos de cada um deles, etc., você entrará em um loop infinito quando atingir um enum. Uma solução estendida (e para ser sincero, tenho certeza de que isso deve estar em uma biblioteca em algum lugar!) Seria:
Classe de teste no Spock (e o Groovy adiciona campos sintéticos):
fonte