簡體   English   中英

Clojure:動態導入Java類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM