你如何在Clojure中引用原始Java类型?

时间:2010-11-27 23:00:45

标签: java clojure java-interop

我想使用反射从Clojure获取Java对象的方法。其中一个参数类型是Java原语,我不知道如何从Clojure中引用它们。

例如,假设我想获得String.valueOf(boolean)。我最接近的猜测是做

(.getDeclaredMethod String "valueOf" (into-array [Boolean]))

但这失败了,因为Boolean本身不是原始类型,而是盒装版本。我尝试了boolean,但是它引用了内置的Clojure函数,并且bool未定义。

如何在Clojure中引用原始Java类型?

2 个答案:

答案 0 :(得分:10)

您可以通过其盒装等效项的TYPE属性来引用基元类型。例如:

user=> (.getDeclaredMethod String "valueOf" (into-array [Boolean/TYPE]))
#<Method public static java.lang.String java.lang.String.valueOf(boolean)>

答案 1 :(得分:0)

在相关说明中,如果要查找原始数组的Java类对象,可以使用以下技巧from the tupelo.types namespace

; An instance of the java.lang.Class<XXXX[]> (e.g. java.lang.Class<Byte[]>). 
(def ^:private  class-boolean-array (.getClass (boolean-array   0)))
(def ^:private  class-byte-array    (.getClass (byte-array      0)))
(def ^:private  class-char-array    (.getClass (char-array      0)))
(def ^:private  class-double-array  (.getClass (double-array    0)))
(def ^:private  class-float-array   (.getClass (float-array     0)))
(def ^:private  class-int-array     (.getClass (int-array       0)))
(def ^:private  class-long-array    (.getClass (long-array      0)))
(def ^:private  class-object-array  (.getClass (object-array    0)))
(def ^:private  class-short-array   (.getClass (short-array     0)))

这用于类型测试,例如:

(defn boolean-array?
  "Returns true is the arg is a boolean array, else false."
  [arg]
  (= class-boolean-array (.getClass arg)))