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!

questionAnswers(3)

yourAnswerToTheQuestion