簡體   English   中英

如何在對象上調用setter方法(強制類型)

[英]how to invoke a setter method on an object (that coerces types)

我希望編寫一個與java對象交互的函數

(assoc-obj <object> "<Prop1>" <Val1> "<Prop2>" <Val2>)

這是一樣的

(doto <object>
     (.set<Prop1> <Val1>)
     (.set<Prop2> <Val2>))

我正在使用反思:

(let [method (->> 
              (seq (.getMethods java.util.Date))
              (filter #(= "setDate" (.getName %)))
              first)
      arr (object-array 1)
      _   (aset arr 0 (int 1))
      d   (java.util.Date.)]
  (.invoke method d arr)
  d)

但我發現類型強制存在問題。

這樣做有更好/更多的方式嗎?

我使用clojure.lang.Reflector/invokeInstanceMethod 這是一個REPL演示:

user=> (def d (java.util.Date.))
#'user/d
user=> d
#inst "2013-12-04T05:47:33.560-00:00"
user=> (clojure.lang.Reflector/invokeInstanceMethod
        d "setDate" (object-array (list 1)))
nil
user=> d
#inst "2013-12-01T05:47:33.560-00:00"

我認為反射器的所有內容都是一個實現細節(方法簽名可能偶爾會發生調整等),但這種功能在Clojure中是必需的,有某種形式。

通過查看您顯示的示例,這似乎是一個簡單的代碼轉換,為什么不是宏:

(defmacro assoc-obj [obj & props]
  (let [psets (map (fn [[p v]] (list (symbol (str ".set" p)) v ))
                   (partition 2 props))]
    `(doto ~obj ~@psets)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM