clojure.core proporciona bean que crea un mapa clojure a partir de un objeto java, pero ¿existe una función inversa que crea un bean (objeto java) a partir de un mapa?

0
beoliver 17 oct. 2017 a las 16:43

2 respuestas

La mejor respuesta

Depende de lo que necesites exactamente.

El tipo de frijol existe en Java

En otras palabras, tiene (digamos) un Customer.class en su proyecto java y le gustaría tener una instancia y completarlo a través de Clojure en función de los datos en su mapa. Esto se puede hacer simplemente a través de interoperabilidad de Java.

Tipo de bean creado en Clojure

Puede utilizar compilación AOT para crear un tipo Javabean, que dará como resultado un archivo .class en el disco y se puede utilizar en un proyecto Java (de la misma forma que cualquier clase Java, que no tiene una fuente Java correspondiente). Puede utilizar la biblioteca clj-bean para evitar utilizar gen-class manualmente.

Tipo de bean creado en Clojure: dinámicamente, sin archivo .class

En este caso, puede usar deftype para crear el bean a través de la creación dinámica de código de bytes (simplemente cree métodos para los captadores y definidores y mover los datos desde el mapa).

Puede encontrar ejemplos de todas las formas anteriores en este proyecto

3
Istvan Devai 17 oct. 2017 a las 21:37

Hay varias bibliotecas que realizan la traducción de Clojure map <-> Java Bean, incluida una que yo creé llamada bean-dip. Aquí está el desglose en el README de las otras opciones consideradas y lo que distingue a bean-dip:

...

Las soluciones de traducción existentes tenían lagunas de funciones que nos llevaron a crear bean-dip: el clojure.core/bean incorporado es unidireccional, utiliza la reflexión sin caché y no se puede configurar. La reflexión en caché está disponible a través de gavagai, pero solo es unidireccional. Hay java.data, que es bidireccional, recursivo y sin reflejos, pero no es declarativo. grandes capas de traducción difíciles de mantener.

Dip de frijoles es:

  • Bidireccional: traduce de beans a mapas y viceversa
  • Declarativo: solo especifique la clase de bean y un conjunto de claves para los mapas correspondientes
  • Recursivo: la traducción desciende a beans anidados cuando también tienen traducciones definidas
  • Sin reflejos: la macro genera un código de tipo sugerido cuyo nombre se puede verificar en el momento de la compilación mediante *warn-on-reflection*
  • Extensible: traducir valores por clave mediante implementaciones de métodos múltiples

Se admiten claves con espacios de nombres, lo que facilita la aplicación de contratos con API de Java mediante especificaciones ...

2
Community 20 jun. 2020 a las 09:12