(import & import-symbols-or-lists)
import-list => (package-symbol class-name-symbols*) For each name in class-name-symbols, adds a mapping from name to the class named by package.name to the current namespace. Use :import in the ns macro in preference to calling this directly.
user=> (import java.util.Date)
java.util.Date
user=> (def *now* (Date.))
#'user/*now*
user=> (str *now*)
"Tue Jul 13 17:53:54 IST 2010"
;; Multiple imports at once.
(import '(java.util Date Calendar)
'(java.net URI ServerSocket)
java.sql.DriverManager)
;; importing multiple classes in a namespace
(ns foo.bar
(:import (java.util Date
Calendar)
(java.util.logging Logger
Level)))
;; For cases when 'import' does not do it for you, i.e. "live-coding"
;; You can use the DynamicClassLoader, ClassReader and the Resolver.
;; https://github.com/clojure/clojure
(def dcl (clojure.lang.DynamicClassLoader.))
(defn dynamically-load-class!
[class-loader class-name]
(let [class-reader (clojure.asm.ClassReader. class-name)]
(when class-reader
(let [bytes (.-b class-reader)]
(.defineClass class-loader
class-name
bytes
""))))
(dynamically-load-class! dcl "java.lang.Long")
(dynamically-load-class! dcl 'org.joda.time.DateTime)
;; From that point the dynamically loaded class can be
;; used by the Reflector to invoke constructors, methods and to get fields.