如何在Clojure中调用传入的类指针上的静态方法?

时间:2014-01-02 09:44:59

标签: clojure clojure-java-interop

我想在Clojure中获得有界基元的位大小。这些可以在

中找到
(java.lang.Integer/SIZE)
=>32

或相等,不那么甜蜜

(. java.lang.Integer SIZE)
=> 32

(我使用java.lang。* - 名称只是为了清楚这些例子,它们可以省略)

当然我想参与调用,比如

(def integer-class java.lang.Integer)

(. integer-class SIZE)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: intger-class in this context, compiling:(/private/var/folders/yt/g82v06jn63qc5273rx4zjx440000gn/T/form-init4887476821027963248.clj:1:1) 

Java中有限原语的数量是有限的,这使得这个练习有点学术性,但问题是:

如何(动态)调用以var?

形式给出的类中的静态方法

1 个答案:

答案 0 :(得分:1)

正如ponzao所说,Clojure vars and Java static methods有一个解决问题的宏jcall的答案。

(defmacro jcall [obj & args]
  (let [ref (if (and (symbol? obj) 
                  (instance? Class (eval obj)))
              (eval obj)
              obj) ]
    `(. ~ref ~@args)))

(jcall java.lang.Integer SIZE) => 32!

感谢。