Javaアノテーションの概要(最も完全な歴史を、この1つは十分にあるがあります)

コメントとは何ですか?

定義された注釈

次のように公式サイトでは説明しました:

アノテーションは、Javaコードにメタデータを提供します。メタデータとして、注釈が直接あなたのコードの実行には影響を与えませんが、ノートのいくつかの種類があります実際にこの目的のために使用することができます。Javaアノテーションは、Java5からJavaへ追加するために始めています。

次いで、上記の単語と次のように変換する:
(1)開発中のメタデータの役割は、データの制約と標準の定義を行うことであり、それは仕様標準コード(テンプレートコード)を理解することができ、
テンプレート(要素(2)

要約すると、注釈は、メタデータであり、それは、私たちは私たちは、より効率的なコードを書くために使用されるコードで正式な情報を追加することが道を提供することを説明し、コメントとして理解することができます。

分類注釈

一般的に使用される注釈は、次の3つのカテゴリに分けることができます。

1、Javaは標準のアノテーションが来る
オーバーライド@含まれ、非推奨@、SuppressWarnings @など、コンパイラを使用して、これらの注釈がチェックされます。

図2に示すように、メタアノテーション
メタデータアノテーションアノテーションは、保持@を含む、アノテーションを定義するために使用されるターゲット@、@継承反復@、@文書化が挙げられます。
元はという特記事項の変更を除いて、標準のJavaアノテーションが付属しても指摘しています。

3、カスタム注釈
ユーザーが自分たちのニーズのコメントを定義することができます。

注釈を使用します

Javaアノテーションの使用が付属しています
Javaの組み込みの注釈、例えば、以下の方法を使用して、注釈をオーバーライドするjava.langでの定義されたアノテーションのセットです。

@Override         //在需要注解的方法上面@Override即可
protected void onCreate() {

}

次のように一般的にJavaアノテーションを使用しました。

1、非推奨@ -マークされたコンテンツは、もはや推奨され;
2、オーバーライド@ -タグ付け方法が唯一カバーし、この方法では、親クラスを示し;
3、@文書化の-コンテンツのjavadocには表示されないことがありマーク。
4 ;だけ「注釈タイプ」をマークするために使用することができ、それは、アノテーションの継承をマークした- 、@継承
5、リテンション@ -だけ「注釈タイプ」をマークするために使用することができ、そしてプロパティRetentionPolicyのアノテーションを指定するために使用されます;
6、ターゲット@ -だけ「注釈タイプ」をマークするために使用することができ、そしてアノテーションのElementTypeの属性を指定するために使用され、
7、@ SuppressWarnings -注釈によって生成された警告の内容は、コンパイラがサイレント警告のままになります。。
8 、@インタフェース-アノテーションを定義するために使用されます。

その中でも、カスタム注釈のために使用4,5,6,8、どのようなリーダーのフォーカスを覚えています。

カスタム注釈

Javaでは、私たちは次のように、@interfaceアノテーションをカスタマイズするために注釈を使用します。

public @interface MyTestAnnotation {

}

この時点で、我々はコメントMyTestAnnotationを定義している、そして私たちは、クラスやメソッドのちょうど新しい注釈を持って行動することができます。

@MyTestAnnotation
public class Test {
   @MyTestAnnotation
   public static void testString(){
   }
}

この時点で、我々は、コメントをカスタマイズしているが、今この注釈は無意味。

注釈を動作させるためにどのように?これはメタアノテーションを使用する必要があります。

一般的に使用されるメタアノテーションは@Retention、@Target、@Document、@Inheritedと@Repeatable 5を持っています。

@Retentionの
注釈相の存在を示す保持予約英語の意味を、保持手段は、ソース(コンパイル)、バイトコード(クラスローダー)またはランタイム(JVMの実行)に保持されています。

列挙RetentionPolicyで@Retentionノートは、保持コメントの期間を表すために使用します。

  • 唯一のソースコード注釈に存在@Retention(RetentionPolicy.SOURCE)、クラスのバイトコードファイルに含まれていません
  • @Retention(RetentionPolicy.CLASS)、デフォルトの保存ポリシー、注釈は、クラスのバイトコードファイル内に存在しますが、実行時には利用できません
  • @Retention(RetentionPolicy.RUNTIME)、注釈は、クラスバイトコード・ファイル内に存在し、実行時に反射することによって得ることができます

私たちは、カスタム注釈されている場合は、以前の分析を通じて、我々のカスタム注釈のみ続ける場合は、ソースコードまたはバイトコードファイルが役割を果たしていますが、動作中の私たちの目的を達成するためにノートを取得することができますので、カスタム注釈次のように確かに、@Retention(RetentionPolicy.RUNTIME)を使用しました:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyTestAnnotation {

}

@Target
ターゲット英語の意味は、それが@targetメタ注釈ノートには、私たちの役割の範囲がより具体的で、クラス、メソッド、メソッドのパラメータ、変数などすることができ示して使用し、また理解することは非常に簡単です、またのElementTypeを列挙することによってクラスのゴールです式のタイプ:

  • @Target(ElementType.TYPE)インターフェース、クラス、列挙、注釈の役割
  • @Target(ElementType.FIELD)role属性フィールド、列挙定数
  • アクションの@Target(ElementType.METHOD)メソッド
  • アクションパラメータの@Target(ElementType.PARAMETER)メソッド
  • @Target(ElementType.CONSTRUCTOR)演技コンストラクタ
  • @Target(ElementType.LOCAL_VARIABLE)ローカル変数を演技
  • @Targetアノテーションの(ElementType.ANNOTATION_TYPE)演技(財産の使用に関する@Retention注釈)
  • @Target(ElementType.PACKAGE)は、バッグに適用しました
  • @Target(ElementType.TYPE_PARAMETER)ジェネリック型に作用する、すなわちジェネリックメソッド、ジェネリッククラス、ジェネリックインターフェイス(jdk1.8を添加)
  • 型を使用@Target(ElementType.TYPE_USE)は(jdk1.8を添加)は、任意のタイプの他のクラスの標識に使用することができます

次のようにElementType.TYPE一般的なタイプは、一般的に、使用されています。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyTestAnnotation {

}

@Documented
ドキュメントは英語の文書を意味します。その役割はのJavadoc行くに含めることができます注釈要素にあります。

@Inherited
彼は他のコメントを変更されていない場合は継承され、英語の意味が継承されていますが、連続して継承は、我々は通常、非常に多くの同じ理解し、それはサブクラス化し、@Inherited注釈付きノート親クラスの変更、サブクラスでありますまた、親クラスのノートを継承します。

@Repeatable
反復英語の意味が反復可能です。名前が示すようにメタアノテーション注釈を付け、この変更命令がオブジェクトに同時に複数回行動するが、各時間役割注釈と異なる意味を表すことができます。

注釈付きソースコード解析は
、私たちには、例えば、ソースコードを解析するために、私はそのソースコードを入力する@OverrideをCtrlキーを押しながらクリックすると、以下のように、一般的なカテゴリを見たい、ノートを@Override:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

私たちは、一般的なコメント@Overrideアノテーションは@interfaceコメントによって定義されて見て、私たちは、ことを知って使用@interfaceが定義されたときに注釈を、それはコメントが注釈であることを、インタフェースを実装しjava.lang.annotation.Annotation意味します

注意:注釈、@インタフェースを定義する必要がある場合には、それは異なっており、我々は通常、インターフェースのメソッドの実装を実装しました。注釈インタフェースの実装の詳細は、コンパイラによって完了します。コメントによって定義された@interface、コメントが他のコメントやインターフェイスを継承することはできません。

次のようにのは、ソースコードの注釈クラスを分析してみましょう:

public interface Annotation {
    boolean equals(Object var1);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

上記のソースを通じて、我々は、注釈自体がサブインタフェースの注釈インタフェースである知っている、という事実は、注釈のプロパティとメソッドを持つことができますが、界面特性が最終的な静的であることを、ノートのために、それは意味がない、と私たちは、インターフェイスを定義しますこの方法は、注釈のプロパティに相当し、それが唯一の理由は、注釈メンバ変数を言うために財産の前面に対応し、実際には、彼は我々が与えることができるブラケットメンバ変数が存在することになる理由であるインタフェースは、括弧のコメントのインターフェイスと異なっている方法です。メンバ変数。

Javaアノテーションアーキテクチャ

次のようにソースコードの解析によると、私たちは、Javaアノテーション(注釈)アーキテクチャになってきました。

Javaアノテーションの概要(最も完全な歴史を、この1つは十分にあるがあります)

0 コメントは、インタフェースクラスは、インターフェイスクラスは、Annotationから継承しています

1、1、1 RetentionPolicy注釈の関連付け
として理解することができる:注釈オブジェクトにつき1 RetentionPolicy独特の特性を有することになります。

2、1、1〜N番目の注釈のElementTypeアソシエーションは
、以下のように理解することができる:各1つの注釈オブジェクトの場合、いくつかのElementTypeを有することができる属性。

図3は、ように推奨されていません、文書化、継承、オーバーライド、および:アノテーションを含むカテゴリの多くは、ある実現します。
各クラスの注釈と関連する実装RetentionPolicyと1と1〜N番目のElementTypeアソシエーション。

注釈の役割

使用前の注釈は、我々が最初にXMLとアノテーションの違いを紹介し、言いました:

  • 注:分散型のメタデータ、しっかりとソースコードを結合させました。
    XMLは:集中型のメタデータであり、ソースコードが結合して自由である
    Javaの背景の開発に使用される設定項目のこの部分を、我々は知っている、マルチサーバ構成項目は、XMLファイルに保存され、その後、2.5春数年前機能の代わりに、設定ファイルを達成するために、注釈ベースの設定を開始します。

注釈は、上記の単純な例で、合計の出発を大量に使用して、注釈には次の4つの主要な機能があります。

図1に示すように、メタデータJavadocの世代識別コードを介して、文書を生成します。

図2に示すように、コンパイラは、コンパイル時のチェックで、コンパイラが確認するようにコードによって識別されたメタデータをチェックします。

3、動的コンパイルプロセスは、動的メタデータは、動的に生成されたコードのように、コンパイル時の識別コードによって処理されます。

図4に示すように、動的プロセス、処理動的メタデータの識別コードは、射出反射例を用いて、例えば、ランタイムによって実行します

おすすめ

転載: blog.51cto.com/14230003/2440990