如何在运行时生成clojure代码来调用java方法?

时间:2016-10-23 06:36:35

标签: java clojure

我想在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函数调用。

1 个答案:

答案 0 :(得分:1)

正如您所知,由于宏在编译时运行,您基本上无法使用它们来调用动态解析的方法。

您有两个选择:

  1. 使用Java Reflection API
  2. 使用clojure.core/eval,它使用Clojure作为运行时编译器来编译代码,然后执行它。