将元数据附加到Clojure gen类

将元数据附加到Clojure gen类,clojure,annotations,gen-class,Clojure,Annotations,Gen Class,是否可以将元数据附加到Clojure gen类 我正在尝试实现一个服务器,它使用一个需要向类添加Java注释的库 从Chas Emerick等人即将出版的书“Programming Clojure”(第9.7.3节)中可以看出,向gen类方法添加注释很容易,但没有提到添加类级注释。我认为在这一点上是不可能的 Rich Hickey提到在这个线程中添加注释支持 但据我所知,这只适用于deftype/defrecord。当然,我可能错了 这两个 (ns genclass.example (:ge

是否可以将元数据附加到Clojure gen类

我正在尝试实现一个服务器,它使用一个需要向类添加Java注释的库


从Chas Emerick等人即将出版的书“Programming Clojure”(第9.7.3节)中可以看出,向gen类方法添加注释很容易,但没有提到添加类级注释。

我认为在这一点上是不可能的

Rich Hickey提到在这个线程中添加注释支持 但据我所知,这只适用于deftype/defrecord。当然,我可能错了

这两个

(ns genclass.example
  (:gen-class ^{:doc "example class"}))

未能为我编译。例外

Exception in thread "main" java.lang.IllegalArgumentException: Metadata can only be applied to IMetas (example.clj:4)`

听起来这是不可能的。

是的,我在这里找到了一个很好的例子:

以下是一些内联的代码,以便将来不会消失:

(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]])

由于我在其他任何地方都找不到文档,所以要添加额外的信息,也可以向构造函数添加注释

通过向构造函数对的第一个数组添加元数据,可以向构造函数添加注释。像这样:

(gen-class
  :name "FooClass"
  :init "init"
  :constructors {^{Inject {}} [Configuration] []}
  :state "state"
  :implements [FooInterface]
  :prefix "ref-")

我已经开始为我的JAX-RSREST服务器使用
deftype
而不是
gen class
,遵循Chas书中的示例。它看起来“更干净”。你可能还喜欢下面的流程图,也是Chas写的:它可能在他的书中,我还没有……当它第一次出现在twitter上时,我看到了流程图。非常好!谢谢。@Ralph,您能帮我把另一个答案标记为已接受的答案吗?因为现在可以通过
gen class
附加注释。
(gen-class
  :name "FooClass"
  :init "init"
  :constructors {^{Inject {}} [Configuration] []}
  :state "state"
  :implements [FooInterface]
  :prefix "ref-")