El problema: me gustaría ser capaz de acceder de forma genérica en Java cualquier propiedad/campo en una de Java ojbect de manera similar a cómo un lenguaje dinámico (creo maravilloso, JavaScript) sería. No sabré en el momento en que estoy escribiendo este código de plomería qué tipo de objeto es o cuál será el nombre de propiedad/campo. Pero sabré el nombre de la propiedad/campo cuando vaya a usarlo.Simulación de la tipificación de pato en Java
Mi solución actual: Hasta ahora he escrito una clase de contenedor simple que utiliza java.beans.Introspector
para agarrar las propiedades de un Bean/POJO y exponerlos como Map<String, Object>
. Es crudo, pero funciona para casos simples.
Mi pregunta ¿Qué otras metodologías hay para abordar este problema además de la reflexión/conversión a un Mapa?
Antes de ir mucho más lejos en este camino, me gustaría saber si alguien sabe cómo podría extraer algo de Rhino o quizás javax.script.*
que tiene una implementación bien pensada de este concepto. O tal vez un enfoque completamente diferente que no he considerado.
Edit: sí Estoy familiarizado con la reflexión (que creo que es lo que Introspector está usando debajo del capó de todos modos). Solo tenía curiosidad si había otras soluciones bien pensadas.
Editar 2: Parece que las respuestas más populares implican 1) reflexión directamente o a través de clases de ayuda, y/o 2) asignación a las interfaces que implementan los miembros de clase deseados. Estoy realmente intrigado por el comentario que habla sobre el aprovechamiento de Groovy. Dado que Groovy tiene un verdadero tipado de pato y es un lenguaje JVM, ¿hay alguna manera de hacer un simple ayudante en Groovy y llamarlo desde Java? Esto sería genial y probablemente más flexible y tenga un mejor rendimiento.
Respondo: Marqué la respuesta de Mike como la mejor ya que es un concepto completo que se acerca más. Probablemente no vaya por esa ruta en este caso particular, pero ciertamente es un enfoque útil. Cualquiera que esté mirando esto debería estar seguro de leer las conversaciones aquí, ya que también hay mucha información útil allí.
Gracias!
¿se trata de un ejercicio académico solamente? – hvgotcodes
¿Conoces la reflexión de Java? Le permite acceder a cualquier campo mediante cualquier método a través de nombres, pero es bastante complicado si lo desea para cada comando en su programa. – gigadot
La reflexión es el camino a seguir, especialmente si no sabe a qué llamar hasta el tiempo de ejecución. – OscarRyz