是否可以将元数据附加到Clojure的gen-class?
我正在尝试实现一个使用需要在类中添加Java注释的库的服务器。
根据Chas Emerick等人即将出版的书《Programming Clojure》(第9.7.3节),向gen-class方法添加注释很容易,但没有提及如何添加类级别的注释。
是否可以将元数据附加到Clojure的gen-class?
我正在尝试实现一个使用需要在类中添加Java注释的库的服务器。
根据Chas Emerick等人即将出版的书《Programming Clojure》(第9.7.3节),向gen-class方法添加注释很容易,但没有提及如何添加类级别的注释。
是的,我在这里找到了一个很好的例子:
https://github.com/clojure/clojure/blob/master/test/clojure/test_clojure/genclass/examples.clj
以下是内联代码,以便在未来不会消失:
(gen-class :name ^{Deprecated {}
SuppressWarnings ["Warning1"] ; discarded
java.lang.annotation.Target []}
clojure.test_clojure.genclass.examples.ExampleAnnotationClass
:prefix "annot-"
:methods [[^{Deprecated {}
Override {}} ;discarded
foo [^{java.lang.annotation.Retention java.lang.annotation.RetentionPolicy/SOURCE
java.lang.annotation.Target [java.lang.annotation.ElementType/TYPE
java.lang.annotation.ElementType/PARAMETER]}
String] void]])
我认为目前这是不可能的。
Rich Hickey在这个帖子https://groups.google.com/group/clojure/browse_thread/thread/d2128e1505c0c117中提到了添加注释支持,但据我所知,这仅适用于deftype / defrecord。当然我可能是错的。
这两个
(ns genclass.example
(:gen-class ^{:doc "example class"}))
和
(ns genclass.example)
(with-meta
(gen-class
:name genclass.example.ClassA
:methods [[hello [] void]])
{:doc "Example class"})
编译失败了。来自异常信息
Exception in thread "main" java.lang.IllegalArgumentException: Metadata can only be applied to IMetas (example.clj:4)`
听起来似乎不可能。
(gen-class
:name "FooClass"
:init "init"
:constructors {^{Inject {}} [Configuration] []}
:state "state"
:implements [FooInterface]
:prefix "ref-")
deftype
而不是gen-class
,遵循Chas书中的示例。它看起来更"简洁"。 - Ralphgen-class
附加注释。 - Jakub Holý