我試圖弄清楚單個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
代替嗎?