2011-10-09 1 views
5

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

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

今後の書籍「Programming Clojure」(9.7.3節)から、gen-classメソッドに注釈を追加するのは簡単ですが、クラスレベルの注釈を追加することは言及されていません。

答えて

2

この時点では可能ではないと思います。

リッチヒッキーは注釈がこのスレッド 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)` 

これは可能ではないようです。

+1

私はJAX-RS REST Serverの 'gen-class'の代わりに' deftype'を使い始めました。これはChasの本の例に従います。それは "クリーナー"と思われる。 – Ralph

+0

次のフローチャートもChasによっても好きかもしれません。http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/ 彼の本、私はまだそれを持っていない... – Paul

+0

私はフローチャートが最初にツイッターに現れたときにそれを見た。かなりいい!ありがとう。 – Ralph

19

はい、それは、私がここに偉大な例を発見された:

(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

に追加情報を追加するには:

https://github.com/clojure/clojure/blob/master/test/clojure/test_clojure/genclass/examples.clj

をここではそれが将来的に消えないようにインライン化いくつかのコードがありますこれは他の場所に文書化されていないので、コンストラクタにアノテーションを追加することも可能です。

コンストラクタペアの最初の配列にメタデータを追加することによって、コンストラクタに注釈を追加できます。

(gen-class 
    :name "FooClass" 
    :init "init" 
    :constructors {^{Inject {}} [Configuration] []} 
    :state "state" 
    :implements [FooInterface] 
    :prefix "ref-") 
関連する問題