2017-08-21 23 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来做我所需要的。

相关问题