我试图找出一种方法来.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
.
所以从中得出了几个问题:
- 如何调用静态方法,例如从实例
TYPE
? - 这里
double-array
有用吗? 这将使我得到携带.invoke
值的数组,无论如何,这甚至看起来都不是必需的,但不是.getMethod
所需的Class[double]
数组。 - 我应该改用
clojure.reflect
吗?
我发现我可以使用clojure.lang.Reflector/invokeInstanceMethod
来做我需要的事情。