Java 16引入了
有一个标准函数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记录实例?
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)])))