6

Clojure gen-class にメタデータを添付することは可能ですか?

クラスに Java アノテーションを追加する必要があるライブラリを使用するサーバーを実装しようとしています。

Chas Emerick 氏らによる近刊の本「Programming Clojure」(セクション 9.7.3) では、注釈を gen クラス メソッドに追加するのは簡単ですが、クラス レベルの注釈を追加することについては言及されていません。

4

3 に答える 3

24

はい、ここで素晴らしい例を見つけました:

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]])
于 2013-04-19T22:52:41.223 に答える
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)`

これは不可能のようです。

于 2011-10-09T15:37:40.390 に答える