从clojure映射创建java bean

时间:2017-10-17 13:43:15

标签: java clojure javabeans

clojure.core提供bean从java对象创建一个clojure映射,但是有一个从映射创建bean(java对象)的反函数吗?

2 个答案:

答案 0 :(得分:3)

取决于您的确切需求。

Bean类型存在于Java

换句话说,您在Java项目中拥有(让我们说)一个Customer.class,并且您希望根据地图中的数据通过Clojure实例化并填充。这可以通过java interop完成。

在Clojure中创建的Bean类型

您可以使用AOT compilation创建Javabean类型,这将在磁盘上生成.class文件,并且可以在Java项目中使用(与任何Java类相同,不具备相应的Java源代码)。您可以使用clj-bean库来避免手动使用gen-class

在Clojure中创建的Bean类型 - 动态,没有.class文件

在这种情况下,您可以使用deftype通过动态字节码创建来创建bean(只需为getter和setter创建方法并将数据从 - 移动到地图上)。

您可以找到以上所有方法的示例in this project

答案 1 :(得分:2)

有各种库执行Clojure map< - > Java Bean转换,包括我编写的一个名为bean-dip的转换。以下是README中关于所考虑的其他选项的细分以及区分bean-dip

的区别
  

...

     

现有的翻译解决方案存在导致我们创建bean-dip的功能差距:clojure.core/bean内置是单向的,使用未缓存的反射并且无法配置。缓存反射可以通过gavagai获得,但它只是单向的。有java.data,它是双向的,递归的和无反射的,但它不是声明性地使大型翻译层难以维护。

     

Bean-dip是:

     
      
  • 双向:从bean转换为地图然后再转换
  •   
  • 声明:只需指定bean类和相应映射的一组键
  •   
  • 递归:当翻译定义了翻译时,翻译会下降到嵌套bean中
  •   
  • 无反射:Macro生成类型提示代码,可以在编译时通过*warn-on-reflection*进行名称检查
  •   
  • 可扩展:通过多方法的实现按键翻译值
  •   
     

支持命名空间键,可以使用规范轻松实现与Java API的合同......