Eu encontrei uma maneira de obter membros herdados via class.getDeclaredFields();
e acesso a membros privados via class.getFields()
Mas estou procurando por campos herdados privados. Como posso conseguir isso?
109
Eu encontrei uma maneira de obter membros herdados via class.getDeclaredFields();
e acesso a membros privados via class.getFields()
Mas estou procurando por campos herdados privados. Como posso conseguir isso?
Respostas:
Isso deve demonstrar como resolvê-lo:
(Ou
Class.getDeclaredFields
para uma matriz de todos os campos.)Resultado:
fonte
getSuperclass()
até chegarnull
se quiser ir mais alto.getDeclaredFields()[0]
ou, emgetDeclaredField("i")
vez disso, repete o[0]
acesso à matriz nas próximas duas instruções?getDeclaredFields
. A resposta foi atualizada.A melhor abordagem aqui é usar o padrão de visitante para localizar todos os campos na classe e todas as superclasses e executar uma ação de retorno de chamada neles.
Implementação
Spring tem uma boa classe Utility
ReflectionUtils
que faz exatamente isso: define um método para fazer um loop em todos os campos de todas as superclasses com um retorno de chamada:ReflectionUtils.doWithFields()
Documentação:
Código de amostra:
Resultado:
fonte
Isso vai resolver:
Se você usa uma ferramenta de cobertura de código como o EclEmma , deve ficar atento: eles adicionam um campo oculto a cada uma de suas classes. No caso do EclEmma, esses campos são marcados como sintéticos e você pode filtrá-los assim:
fonte
(com base nesta resposta)
fonte
Na verdade, eu uso uma hierarquia de tipo complexa, então sua solução não está completa. Preciso fazer uma chamada recursiva para obter todos os campos herdados privados. Aqui está minha solução
fonte
Eu precisava adicionar suporte para campos herdados para blueprints no Model Citizen . Eu deduzi esse método que é um pouco mais conciso para recuperar os campos + campos herdados de uma classe.
fonte
fonte