如何将Java 17记录转换为Clojure映射



有一个标准函数clojure.core/bean将POJO转换为映射:

class MyPojo{
public String getFirst(){ return "abc"; }
public int getSecond(){ return 15; }
}
IFn bean = Clojure.var("clojure.core", "bean")
var result = bean.invoke(new MyPojo())
// result => {:first = abc, :second = 15}

对于Java17记录类,此函数将不起作用,因为记录不遵循属性的POJO约定"get***"

Clojure是否以同样的方式支持Java17记录实例?

Java 16引入了Class.getRecordComponents。因此,给定一个记录的实例,您可以查找该记录的类,以及它的记录组件。每个记录组件都有一个名称和一个getter方法,您可以使用它来查找该组件的值。您可以将这些部分放在一起构建bean的类似物。
(defn record->map [r]
(into {} (for [^java.lang.reflect.RecordComponent c (seq (.getRecordComponents (class r)))]
[(keyword (.getName c))
(.invoke (.getAccessor c) r nil)])))

最新更新