我想在Clojure函数中使用Java反射方法。
我认为像(.toString {:a 1})
这样的代码将由clojure reader解析和编译。因此,它使用clojure宏。但是如果我想在运行时定义一个函数来调用java对象方法,那就失败了。我不知道如何在clojure中调用这种代码。
这是我的演示代码:
(def jmethod ".toString")
(defn call-java-method [mname & body]
(let [fn1 (fn [] `(~(symbol mname) ~@body))]
(fn1)))
user=> (call-java-method jmethod 3.4M)
结果是列表(.toString 3.4M)
,但我想将此列表作为clojure函数调用。
答案 0 :(得分:1)
正如您所知,由于宏在编译时运行,您基本上无法使用它们来调用动态解析的方法。
您有两个选择:
clojure.core/eval
,它使用Clojure作为运行时编译器来编译代码,然后执行它。