2017-08-21 31 views
2

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

所以有幾個問題出來的這個:

  1. 如何調用靜態方法,如TYPE從實例?
  2. 這裏有沒有用於double-array?這將使我得到數組來攜帶.invoke的值,而這個數值甚至不是必需的,但不是.getMethod所需的Class[double]數組。
  3. 應該用clojure.reflect代替嗎?

回答

1

我發現我可以用clojure.lang.Reflector/invokeInstanceMethod來做我所需要的。

相關問題