![](/img/trans.png)
[英]How to invoke a method of child class dynamically which specified by string value in base class?
[英]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.