将元数据附加到Clojure gen-class

时间:2011-10-09 12:22:24

标签: clojure annotations gen-class

是否可以将元数据附加到Clojure gen-class?

我正在尝试实现一个使用库的服务器,该库需要将Java注释添加到类中。

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

3 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:1)

我认为此时不可能。

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)`

听起来这是不可能的。

答案 2 :(得分:1)

要向此添加其他信息,因为我无法在其他任何地方找到它,也可以向构造函数添加注释。

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

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