如何在运行时生成Clojure代码以调用Java方法?

3
我希望在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个回答

1

正如您所意识到的那样,由于宏“在编译时运行”,因此您基本上无法使用它们来调用动态解析的方法。

您有两个选择:

  1. 使用Java的反射API
  2. 使用clojure.core/eval,这意味着使用Clojure作为运行时编译器来编译您的代码,然后执行它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接