【发布时间】:2019-02-26 16:27:13
【问题描述】:
我正在尝试创建一个宏,在 Clojure 中使用 注解动态创建 java 对象。
我一直在尝试proxy 和reify 都没有成功面对CompilerException。
这里就是:
代理
第一次尝试是创建一个没有宏的对象:
(.toString
(proxy [java.lang.Object] []
(toString [] (str "proxyToString"))))
结果为:=> "proxyToString"
然后我尝试用宏包装它并将object 作为参数传递:
(defmacro create-obj-with-proxy [klass]
`(proxy [~klass] [] (toString [] (str "proxyToString"))))
结果为:=> #'oppose/create-obj-with-proxy
我可以扩展或评估它
(macroexpand (create-obj-with-proxy java.lang.Object))
(.toString (create-obj-with-proxy java.lang.Object))
它也适用于 reify。
(defmacro create-obj-with-reify [klass]
`(reify ~klass
(toString [this] "reifyToString")))
(macroexpand (create-obj-with-reify java.lang.Object))
(.toString (create-obj-with-proxy java.lang.Object)
但是如果我将类名关联到一个变量,我会得到异常
(def give-me-class java.lang.Object)
(def give-me-class-fn [] java.lang.Object)
(.toString (create-obj-with-proxy give-me-class))
(.toString (create-obj-with-proxy (give-me-class-fn)))
(.toString (create-obj-with-proxy give-me-class))
CompilerException java.lang.ClassCastException: clojure.lang.Var cannot be cast to java.lang.Class, compiling:
(.toString (create-obj-with-proxy (give-me-class-fn)))
CompilerException java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol, compiling:
有什么建议吗?
编辑:感谢@Michiel Borkent 修复了对象创建问题。
【问题讨论】: