【问题标题】:How to generate clojure code to call java method at run time?如何生成 clojure 代码以在运行时调用 java 方法?
【发布时间】:2016-10-23 06:36:35
【问题描述】:

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

【问题讨论】:

    标签: java clojure


    【解决方案1】:

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

    你有两个选择:

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

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 2019-12-02
      • 2023-04-07
      相关资源
      最近更新 更多