Simulando digitação de pato em Java
O problema: Eu gostaria de poder acessar genericamenteem Java qualquer propriedade / campo em um objeto Java é similar à de uma linguagem dinâmica (pense Groovy, JavaScript). No momento em que escrevo este código de canalização, não saberei que tipo de objeto é ou qual será o nome da propriedade / campo. Mas saberei o nome da propriedade / campo quando for usá-lo.
Minha solução atual: Até agora eu escrevi uma classe simples de wrapper que usajava.beans.Introspector
para pegar as propriedades de um Bean / POJO e expô-las como umMap<String, Object>
. É bruto, mas funciona para casos simples.
Minha pergunta é que outras metodologias existem para abordar esse problema além da reflexão / conversão para um mapa?
Antes de avançar muito nesse caminho, gostaria de saber se alguém sabe como eu posso canibalizar algo do Rhino ou talvezjavax.script.*
que tem uma implementação bem pensada desse conceito. Ou talvez uma abordagem totalmente diferente que eu não considerei.
Editar: sim, eu estou familiarizado com a reflexão (que eu acredito que é o que o Introspector está usando sob o capô de qualquer maneira). Fiquei curioso para saber se havia outras soluções bem pensadas.
Edição 2: Parece que as respostas mais populares envolvem 1) reflexão direta ou via classes auxiliares e / ou 2) mapeamento para interfaces que implementam os membros da classe desejados. Estou realmente intrigado com o comentário que fala sobre alavancar o Groovy. Como o Groovy possui uma verdadeira digitação de pato e é uma linguagem JVM, existe uma maneira de criar um simples auxiliar no Groovy e chamá-lo de Java? Isso seria muito legal e provavelmente mais flexível e funcionaria melhor.
Responda: Marquei a resposta de Mike como a melhor, pois é um conceito completo que se aproxima mais. Provavelmente não seguirei esse caminho nesse caso em particular, mas é certamente uma abordagem útil. Qualquer pessoa que leia isso deve ler as conversas aqui, pois também há muitas informações úteis.
Obrigado!