web-dev-qa-db-ja.com

パッケージアノテーションのポイントは何ですか?

Javaでアノテーションはどこでどのように使用されますか? のおかげで、クラスアノテーションの目的を理解しています。説明されているように、パッケージアノテーションの目的は何ですか このブログ投稿で および Java言語仕様 の§7.4.1?

メタデータをパッケージに関連付けたいのはなぜですか?どんなことができますか?

39
Gili
  1. bnd tool (およびmaven-bundle-plugin)はパッケージアノテーションを利用します。 @ Version および@Exportアノテーションをpackage-info.Javaに入れると、OSGiメタデータを生成できます。
  2. javadocはパッケージアノテーションを使用します。
  3. JAXBは、パッケージレベルのアノテーション たとえば を使用して、Javaタイプからパッケージ全体のXMLスキーマタイプへのマッピングを指定します。パッケージアノテーションは、JBossのxmlバインディングでも使用されます。 。
  4. Struts 2 Conventionプラグインは、 アノテーション を使用して、パッケージ内のすべてのアクションのデフォルトのインターセプターを指定します。
  5. いくつかのパッケージレベルがあります Hibernate Annotations 。これらの注釈の使用例は、 ここ にあります。
42
viaclectic

@Deprecatedは理にかなっていると思います。また、パッケージ全体がJava以外のソースから何らかのツールによって生成された場合は、@Generatedのようなものになる可能性があります。または、このパッケージがパブリックAPIの一部でない場合は、@Internal

たぶん、OSGiツール(パッケージのバージョンと依存するパッケージを宣言する必要がある場合)もこれを利用できるでしょう。

野生のものを見た人はいますか?

7
Thilo

私が考えることができる2つの理由:

  • 特別なパッケージに注釈を付けて、特定の機能のためにいくつかの側面(たとえば、AspectJを使用)にクラスを織り込むことができるようにします。
  • ソース、メタデータ、その他の種類のリソース生成など、一部のツールで読み取られるパッケージに注釈を付けます。
4
Amir Moghimi

たとえば、JAXBでは、型で通常使用される ほとんどの注釈 をパッケージに同様に適切に適用できます。その場合の意味は、そのパッケージ内のすべてのクラスのデフォルトを指定することです。

たとえば、getter/setterを介して公開されるパッケージ内のすべてのクラスのすべてのプロパティをXMLでマップする場合は、各クラスに@XmlAccessorType(XMLAccessType.PROPERTY)を指定できますまたは単に指定するその包み。

2
Joachim Sauer

これは本当の目的ではありませんが、package-info.Javaファイルの再コンパイルを回避するための回避策としてそれらを使用しています。

問題は、ドキュメント(存在する理由)と<javac>ステートメントしかない場合、javac(およびAntタスクpackage bla;)がpackage-info.Javaのクラスファイルを作成しないことと、antタスクが対応する.classファイルがない(または古い)すべてのファイルを再コンパイルします。

そこにダミーの注釈(SuppressWarningsなど)を追加すると、package-info.classが生成されるため、ファイルは再度変更されるまで再コンパイルされません。

(Ant 1.8.0は、注釈がない場合でも、空のpackage-info.classを作成することでこれを解決しましたが、ここでは古いantを使用しています。)

1
Paŭlo Ebermann

テストメタデータ-テストパッケージ(単体テストなど)に関するメタデータです。機能、所有者、バージョン、バグ/問題など、パッケージレベルで適切なさまざまなテストメタデータを割り当てることができます。これらはクラスまたはメソッドレベルで改良できますが、パッケージレベルの定義またはデフォルトがあります。簡潔にするために便利かもしれません。私はこのアプローチの変形を利用しました(注釈の利点の前に)。

機能、所有権、欠陥、履歴情報など、同じ種類のものに関する一般化されたコードメタデータについても同様の議論を行うことができます。

0
Will