我试图弄清楚单个arg的.invoke()
方法,而不知道运行时arg的类型。Clojure:在编译时调用.invoke而不知道arg类型
例如,通过将属性名称传递给下面的函数,我想设置属性的值。目前它的硬编码为Double/TYPE
,但真正的功能应该允许采取任何类型的value
arg。
直到运行时才知道属性名称,因此arg value
的类型是不知道的,但它看起来该方法需要一个基元数组,至少对于数字类型。
(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
。
所以有几个问题出来的这个:
- 如何调用静态方法,如
TYPE
从实例? - 这里有没有用于
double-array
?这将使我得到数组来携带.invoke
的值,而这个数值甚至不是必需的,但不是.getMethod
所需的Class[double]
数组。 - 应该用
clojure.reflect
代替吗?