[英]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.