Прикрепление метаданных к классу Clojure - PullRequest
5 голосов
/ 09 октября 2011

Можно ли прикрепить метаданные к классу Clojure?

Я пытаюсь реализовать сервер, который использует библиотеку, требующую добавления аннотаций Java к классам.

Из книги Чэса Эмерика и др., Которая выйдет в ближайшее время "Программирование Clojure" (раздел 9.7.3), легко добавлять аннотации к методам класса gen, но нет упоминания о добавлении аннотаций уровня класса.

Ответы [ 3 ]

22 голосов
/ 20 апреля 2013

Да, я нашел отличный пример здесь:

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 голос
/ 09 июня 2016

Чтобы добавить к этому дополнительную информацию, потому что я не могу найти ее документированной где-либо еще, можно также добавлять аннотации к конструкторам.

Вы можете добавлять аннотации к конструкторам, добавляя метаданные в первый массивпара конструктора.Как это:

(gen-class
  :name "FooClass"
  :init "init"
  :constructors {^{Inject {}} [Configuration] []}
  :state "state"
  :implements [FooInterface]
  :prefix "ref-")
1 голос
/ 09 октября 2011

Я не думаю, что это возможно в данный момент.

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

Звучит так, как будто это невозможно.

...