我正在Clojure中编写简单的应用程序。我的任务是获取(来自用户)实现Runnable接口和调用start方法的完全限定类名(Java类)。我的问题是当我不知道类名a-priori时如何运行这个方法?基于this我尝试了类似的东西(在简单的String类上),但我失败了:
(defn schedule [parameter]
(def class-name (subs parameter 6)) ; get just class name for e.g. java.lang.String
(println (.getName class-name)))
我也发现了this,但我不太确定如何使用它,因为我也失败了。有什么想法吗?
答案 0 :(得分:2)
您可以使用宏或eval
执行此操作。通常更喜欢宏到eval。
user> (defmacro runnerizer [class-name]
`(~(symbol (str class-name "/" "start"))))
#'user/runnerizer
user> (macroexpand-1 '(runnerizer "myClass"))
(myClass/start)
答案 1 :(得分:2)
如果您希望避免使用宏,可以执行以下操作:
(defn schedule [name]
(let [thread (-> name Class/forName .newInstance Thread.)]
(.start thread)
thread))
然后,您可以使用通常的Java方式与返回的Thread对象进行交互。