Javaのアドバンスシリーズ - ノート(注釈)
I.はじめに
特別なインタフェースとして表示されるようにコメント:このシリーズのこの部分は、我々は、バージョンのJava 5ジェネリックに導入され、別の強力な機能に加えて、列挙をご紹介します。
注釈は、それは、Java言語や構造の異なる要素に関連付けることができ、メタデータの特別な種類です。興味深いことに、JavaのエコシステムにXMLディスクリプタを使用してローカルモデルのほとんどは、注釈は、これらのXML記述子の解消に大きな貢献をしました。これは、セキュリティの新しいタイプと非常に堅牢な構成とパーソナライゼーション技術の導入を指摘しています。
特別なインタフェースとして第二に、コメント
我々は、Java言語に関連するメタデータアノテーションと異なる要素として、上記で述べたように。
ノート注釈要素自体は、それが任意の直接的な影響が発生することはありません。しかし、ノートとそれが定義されている方法に頼って、彼らは、Javaコンパイラことができます(最良の例は、@Override注釈を使用前回の記事のノートである)、注釈プロセッサと実行時コードを反射し、他の仮想マシンを使用してイントロスペクション技術。
のは、簡単な文のノートを見てみましょう:
公共@interface SimpleAnnotation { }
@interfaceキーワードはノートが特別なインタフェースとして見ることができる理由である新しい注釈タイプを紹介し、注釈はデフォルト値と属性にはデフォルト値を持たない宣言することができ、例えば:
公共@interfaceのSimpleAnnotationWithAttributes { 文字列名(); int型の順序()デフォルト 0 ; }
注釈は、プロパティにデフォルト値がないことを宣言した場合は、注釈は、アプリケーション内にある注釈属性値の場所を提供する必要があります。
@SimpleAnnotationWithAttributes(名前= " 新しい注釈")
便宜上、コメントだけの属性とname属性に値がある場合、プロパティの名前のような、省略することができます。
公共@interface SimpleAnnotationWithValue { String値(); }
この注釈の上記のステートメントは、使用するには、次の方法で指定できます。
@SimpleAnnotationWithValue( "新注釈")
ノートはまた、いくつかの制限があり、いくつかのケースでは、アノテーションの使用は不便かもしれません。
-
まず、コメントは任意の継承をサポートしていません:注釈は、他のコメントを継承することはできません。
-
第二に、フォームは注釈インスタンスを作成するために、新しいキーワードを使用してエンコードすることはできません。
-
第三に、ステートメントは、基本的なデータ型の属性、文字列またはクラス<?>と入力し、配列を指摘しています。
-
第四に、ノートは宣言メソッドとコンストラクタは許可されていません。
第三に、注釈およびリテンションポリシー(保持ポリシー)
各注釈は、列挙の注釈戦略の組み合わせ(RetentionPolicyタイプ)のセットを維持する方法である、保持ポリシー(保持ポリシー)と呼ばれる機能となっています。保持ポリシーは、一つの値以下に設定することができます。
戦術 | 説明 |
---|---|
クラス | コンパイラの注釈がクラスファイルに記録されますが、実行時の仮想マシンの予約時に必要とされていない(つまり、何も実行時間はありません) |
ランタイム | コンパイラの注釈は、クラスファイルに記録され、実行されている仮想マシン内に保持されているので、あなたは、リフレクションを介して取得することができます |
ソース | コンパイラ注釈が破棄され(すなわち、ソースコード内の保持のみ注釈、クラスファイルが存在しません) |
保持ポリシーは、取り扱いの際に使用することができます注釈に決定的な影響を与えています。保持ポリシーは@Retentionコメントを使用して設定することができます。例えば:
輸入java.lang.annotation.Retention。 輸入java.lang.annotation.RetentionPolicy。 @Retention(RetentionPolicy.RUNTIME) パブリック@interfaceのAnnotationWithRetention { }
RUNTIMEをコメントする設定注釈保持ポリシーは、コンパイルプロセスの存在と、アプリケーションが実行されていることを確認します。
第四に、ノートや要素型(のElementType)
もう一つの特徴は、各注釈付き要素を適用することができるタイプを持っている必要があり注釈されています。保持ポリシーに幾分類似、要素タイプは、列挙型(のElementType)の可能な要素の集合として定義されます。
要素タイプ | 説明 |
---|---|
ANNOTATION_TYPE | 注釈は注釈型宣言を示すために使用することができる(追加の注釈を適用) |
コンストラクタ | 注釈は、コンストラクタ宣言を示すために使用することができます |
フィールド | 注釈は(列挙定数を含む)フィールド/フィールドステートメントを示すために使用することができます |
LOCAL_VARIABLE | 注釈は、ローカル変数宣言を示すために使用することができます |
方法 | 注釈は、メソッドの宣言を示すために使用することができます |
パッケージ | 注釈は、パッケージ宣言を示すために使用することができます |
PARAMETER | 注釈は、パラメータ宣言を示すために使用することができます |
タイプ | 注釈は、クラス、(注釈型を含む)インタフェース、列挙型宣言を示すために使用することができます |
さらに、上述したタイプのこれらの要素に加えて、Javaのバージョン8は、2つの新しい注釈型要素を使用することができる導入します。
要素タイプ | 説明 |
---|---|
TYPE_PARAMETER | マークノートは変数宣言文のタイプに書き込むことができます |
TYPE_USE | (:、宣言ジェネリックと文をキャストなど)これは、ノートは声明のいずれかのタイプを使用して書き込むことができることを示しています |
そして、保持ポリシーの比較、注釈を使用することができ@Targetアノテーションはそれでより多くの種類に関連付けられた複数の要素を宣言します。例えば:
輸入java.lang.annotation.ElementType。 輸入java.lang.annotation.Target; @Target({ElementType.FIELD、ElementType.METHOD}) パブリック@interface AnnotationWithTarget { }
ほとんどの場合、ポリシーを作成したいすべてのノートには、要素の型を指定する必要がありますし、予約が便利です。
第五に、メモや継承(注釈と継承)
Javaでは、宣言ノートと継承の間で非常に重要なリンクがあります。デフォルトでは、サブクラスが宣言親クラスのノートを継承することはできません、しかし、クラス階層に@Inherited注釈パスのノートを使用して指定することができる方法があります。例えば:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @interface InheritableAnnotation { } @InheritableAnnotation パブリック クラス親{ } パブリック クラスの子供は、親{延び }を
この例では、親クラスの@InheritableAnnotationノートはサブクラスによって継承できると宣言しました。
六、繰り返すことができますノート(反復注釈)
これまでのところ、我々はそれがある、以前の8のJavaに関連した限定バージョンと追加の注意事項を説明していない、同じ場所で同じノートは一度だけ発生する可能性があり、何回も繰り返すことはできません。サポートの繰り返しノートを提供することにより、この制限を緩和するためのJava 8。例えば:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) パブリック@interfaceのRepeatableAnnotations { RepeatableAnnotation []の値(); } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Repeatable(RepeatableAnnotations。クラス) パブリック@interfaceのRepeatableAnnotation { String値(); }。 @RepeatableAnnotation(" repeatition 1 " ) @RepeatableAnnotation(" repeatition 2 " ) 公共 ボイドperformAction(){ // ここではいくつかのコード }
Javaの8中の繰り返し注釈が(@Repeatableを使用)再利用できる注釈を作るためにいくつかの作業を行う必要があるが、最終結果はそれだけの価値があるけれども:より簡潔かつコンパクトにコメントしたコード。
七個の注釈プロセッサ(注釈プロセッサ)
注釈プロセッサと呼ばれるJavaコンパイラは(-processorコマンドライン引数を使用して)、プラグインの特殊なタイプをサポートし、それはコンパイル時に注釈を扱うことができます。注釈プロセッサは、注釈の役割を(静的コード分析を実行する)分析追加のJavaソースファイルまたはリソースを作成(コンパイルして処理することができる)、または注釈付きコードを変更することができます。
注釈で極めて重要な役割を果たしてきたプロセッサのアプリケーションやプロセス、保持ポリシー(保持ポリシー)を注釈を付けることができ、コンパイラに指示します。
注釈プロセッサは、広く使用されているが、プロセッサについてのコメントを書くためには、Javaが仕事とコンパイルプロセス自体をのコンパイラ方法のいくつかの知識を必要としています。
大会より大きいVIII注釈の設定(注釈や慣例を超える設定)
条約は、構成されたソフトウェアの設計手法よりも大きいと実践が開発プロセスを簡素化するために設計され、開発者は、いくつかの簡単なルール(または契約)に追従する必要があります。たとえば、MVCフレームワーク規則の一部は、コントローラディレクトリ(またはパッケージ)上のコントローラに従います、いくつかのORMフレームワークは、多くの場合、モデルのディレクトリ内のエンティティクラスを検索し、それぞれのクラスからテーブル名を取得するための規則に従ってください。
一方、ノートには、すべての明示的な設定に基づいて、それによって異なる設計の練習を作成しました。上述の用語上記の例では、@コントローラ注釈エンティティアノテーション@、コントローラとしてデータベース・テーブルに関連付けることができる任意のクラスを明確にマークすることができます。ノートはまた、スケーラビリティのノートは、追加のプロパティおよび特定の要素の限定された型を持つことができるという事実から恩恵を受ける。注釈と構成の問題の不適切な使用を強制するJavaコンパイラは、長いコンパイル時にエラーを発見しました。
九、使用する注釈
どこにでも実際には注意:Javaの標準ライブラリにはたくさん持っている、基本的にすべてのJava仕様では、ノートが含まれています。あなたのコードに関連付けられたメタデータを添付する必要があるたびに、注釈は、シンプルかつ直接的な方法です。
興味深いことに、Javaコミュニティは常にセマンティック概念や技術基準の多様介して共通の公共の開発に取り組んでいる注釈(詳細については、JSR-250仕様を参照してください)。現在、標準のJavaライブラリは、以下のコメントが含まれています。
コメント | 説明 |
---|---|
@Deprecated | これは、マークされた要素の有効期限が切れていると、もはや使用すべきではないことを示しています。プログラムは、注釈注釈を付け、クラスまたはフィールド(ドメイン)を使用する場合は常に、コンパイラは警告を生成します。 |
@オーバーライド | 要素は親クラスで宣言された要素を包含することを意図しているコンパイラにヒント。 |
@SuppressWarnings | これは、他の手段によって生成された警告を抑制するために、コンパイラに指示します。 |
@SafeVarargs | メソッドまたはコンストラクタ宣言コードに適用した場合、変数パラメータのその潜在的に危険な動作を行いません。あなたはこの注釈タイプを使用する場合、それは未チェックの可変パラメータの使用に関する警告が抑制されます。 |
@保持 | 注釈がマークされて維持する方法を指定します。 |
@ターゲット | マークされた注釈は、Javaでこれらの要素を使用することができます指定 |
@Documented | 注釈ツールJavadocの記録素子の使用を使用することができること(デフォルトでは、注釈は、Javadocの中に含まれていません) |
@継承されました | 注釈型は、親クラスから継承することができます表示します |
バージョンのJavaの8リリースには、いくつかの新しいコメントが追加されます。
コメント | 説明 |
---|---|
@FunctionalInterface | これは、宣言のタイプが仕様に従ってJava言語を定義するのインターフェイスの関数であることを示します。 |
@Repeatable | マークを表示するノートは、同じ場所で複数回適用することができます。 |
X.の概要
この記事では、我々が保持ポリシーと要素の型注釈を指定する必要があるということです、我々は一般的に、注釈新規コメントを定義するには、特別なインタフェースとして使用することができます理解することができますこの記事を読んで、ノートや関連コンテンツのいくつかについて教えてくれる。我々はまた、注釈サブクラスは親クラスを継承し、どのように反復可能なコメントを宣言するようにする方法を説明します。もちろん、我々はまた、注釈プロセッサに概念のいくつかについて話して、注釈の設定は、コンプライアンスの合意よりも大きくなります。次に、我々は効果的にメソッドを記述するために、ので、しばらくお待ち方法について説明します。