繁体   English   中英

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

[英]Invoke method of a class which name is generated dynamically

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

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

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

您可以使用macro或eval 通常,首选宏而不是eval。

user> (defmacro runnerizer [class-name] 
          `(~(symbol (str class-name "/" "start"))))                                                    
#'user/runnerizer                                                                                                                     
user> (macroexpand-1 '(runnerizer "myClass"))                                                                                         
(myClass/start) 

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM