[英]Clojure: import java class dynamically
假設我定義了這種clojure函數:
(defn print-this [this] (println "print this: " this))
如果我在repl中使用該功能:
(print-this that)
我最終會得到:
print this: that
nil
作為輸出。
現在,如果我做出這樣的定義:
(defn import-by-name [name] (import (some.package.value name)))
並在repl中使用該函數:
(import-by-name "SomeClassName")
我懂了
java.lang.ClassNotFoundException: some.package.value.name (NO_SOURCE_FILE:0)
我希望將“名稱”替換為“ SomeClassName”。 如果輸入:
(import (some.package.value SomeClassName))
一切正常。
為什么上面的import-by-name函數沒有解釋[name]? 是否可以從變量值動態導入Java類? 如果可以,怎么辦? 謝謝!
import
是一個宏,因此傳遞給它的任何符號都將按字面意義使用。
(macroexpand '(import (some.package.value name)))
;; => (do (clojure.core/import* "some.package.value.name"))
文字
對於字符串文字和擴展集合文字,您可以使用宏來完成所描述的內容。
(defmacro import-by-name [name] `(import '[some.package.value ~name]))
(import-by-name "ClassName") ;; => nil
Vars
為了從var導入類,您必須開始深入研究名稱空間的內部。
(defn import-by-name [n]
(.importClass (the-ns *ns*)
(clojure.lang.RT/classForName (str "some.package.value." n))))
可能有一種更清潔的方法,如果找到答案,我將更新此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.