2

我正在用 Clojure 编写简单的应用程序。我的任务是(从用户)获取实现 Runnable 接口并调用 start 方法的完全限定类名(Java 类)。我的问题是当我不知道类名先验时如何运行此方法?基于,我尝试过这样的事情(在简单的 String 类上),但我失败了:

(defn schedule [parameter]
  (def class-name (subs parameter 6))       ; get just class name for e.g. java.lang.String
  (println (.getName class-name)))

我也找到了这个,但我不太确定如何使用它,因为我也失败了。有任何想法吗?

4

2 回答 2

2

您可以使用宏或eval. 通常更喜欢宏而不是 eval。

user> (defmacro runnerizer [class-name] 
          `(~(symbol (str class-name "/" "start"))))                                                    
#'user/runnerizer                                                                                                                     
user> (macroexpand-1 '(runnerizer "myClass"))                                                                                         
(myClass/start) 
于 2013-03-21T21:15:41.767 回答
2

如果您希望避免使用宏,您可以执行以下操作:

(defn schedule [name]
  (let [thread (-> name Class/forName .newInstance Thread.)]
    (.start thread)
    thread))

然后,您可以以通常的 Java 方式与返回的 Thread 对象进行交互。

于 2013-03-21T21:27:29.030 回答