Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
64 lines (55 sloc) 2.47 KB
;;; import_static.clj -- import static Java methods/fields into Clojure
;; by Stuart Sierra, http://stuartsierra.com/
;; June 1, 2008
;; Copyright (c) Stuart Sierra, 2008. All rights reserved. The use
;; and distribution terms for this software are covered by the Eclipse
;; Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;; which can be found in the file epl-v10.html at the root of this
;; distribution. By using this software in any fashion, you are
;; agreeing to be bound by the terms of this license. You must not
;; remove this notice, or any other, from this software.
(ns
#^{:author "Stuart Sierra",
:doc "Import static Java methods/fields into Clojure"}
clojure.contrib.import-static
(:use clojure.set))
(defmacro import-static
"Imports the named static fields and/or static methods of the class
as (private) symbols in the current namespace.
Example:
user=> (import-static java.lang.Math PI sqrt)
nil
user=> PI
3.141592653589793
user=> (sqrt 16)
4.0
Note: The class name must be fully qualified, even if it has already
been imported. Static methods are defined as MACROS, not
first-class fns."
[class & fields-and-methods]
(let [only (set (map str fields-and-methods))
the-class (. Class forName (str class))
static? (fn [x]
(. java.lang.reflect.Modifier
(isStatic (. x (getModifiers)))))
statics (fn [array]
(set (map (memfn getName)
(filter static? array))))
all-fields (statics (. the-class (getFields)))
all-methods (statics (. the-class (getMethods)))
fields-to-do (intersection all-fields only)
methods-to-do (intersection all-methods only)
make-sym (fn [string]
(with-meta (symbol string) {:private true}))
import-field (fn [name]
(list 'def (make-sym name)
(list '. class (symbol name))))
import-method (fn [name]
(list 'defmacro (make-sym name)
'[& args]
(list 'list ''. (list 'quote class)
(list 'apply 'list
(list 'quote (symbol name))
'args))))]
`(do ~@(map import-field fields-to-do)
~@(map import-method methods-to-do))))
Something went wrong with that request. Please try again.