Clojure:在编译时不知道 arg 类型的情况下调用 .invoke



我试图找出一种方法来.invoke()单个参数的方法,而不知道运行时参数的类型。

例如,通过将属性名称传递给以下函数,我想设置属性的值。 目前它被硬编码为Double/TYPE,但实际上应该允许该函数采用任何类型的value参数。

属性名称,因此 argvalue的类型直到运行时才知道,但是该方法似乎需要一个基元数组,至少对于数字类型是这样。

(defn set-prop-val!
"Sets property value to value.  Uses reflection."
[obj prop value]
(let [methodname (str "set" prop)]
(.. obj
getClass
(getMethod methodname (into-array [Double/TYPE]))
(invoke obj (into-array [value]) ))))
(set-prop-val! (Button.) "TranslateX" 13.99)

在上面的函数中,尝试代替(getMethod methodname (into-array [(class value)]))不起作用,我得到NoSuchMethodException javafx.scene.control.Button.setTranslateX(java.lang.Double),因为它想要一个double而不是一个Double

我想做的是让数字在运行时获取基元类型,但是所有从实例调用静态方法的尝试都失败了,例如(. (class 19.5) TYPE)(在这种情况下,我得到IllegalArgumentException No matching field found: TYPE for class java.lang.Class(

似乎只有Double/TYPE有效,即使(= (class 19.5) Double)返回true.

所以从中得出了几个问题:

  1. 如何调用静态方法,例如从实例TYPE
  2. 这里double-array有用吗? 这将使我得到携带.invoke值的数组,无论如何,这甚至看起来都不是必需的,但不是.getMethod所需的Class[double]数组。
  3. 我应该改用clojure.reflect吗?

我发现我可以使用clojure.lang.Reflector/invokeInstanceMethod来做我需要的事情。

最新更新