调用动态生成名称的类的方法

时间:2013-03-21 20:53:48

标签: java clojure

我正在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,但我不太确定如何使用它,因为我也失败了。有什么想法吗?

2 个答案:

答案 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对象进行交互。