Javaアノテーション(注釈)の実装原理

まず、ノートの導入

ノートはjava.lang.annotationパッケージを置かjava5の初めに導入されたJava言語機能、です。

コンセプト:Javaコードに追加のメタデータのためのアノテーションはコンパイル時や実行時の方法でメタデータを解析し、処理することができます。理解するためのシンプルでは、​​メンバ変数のラベルは、特別な意味を貼り付け、人々は明らかにこのマシンがラベルに対応する、このラベルを達成する参照、このラベルの彼の役割とスコープを見ることができ、クラス、メソッド、特定のパッケージ名を与えることです(ビジネスロジックの場合場合)サービス論理。

第二に、役割のコメント

  • メタデータの識別コードを介してドキュメント、Javadocの生成を生成します。

  • コンパイラのチェックがコンパイル時に検証するようにコンパイルのチェック、メタデータはコードで識別されます。

  • コンパイル時のダイナミクスは、動的なコードは、動的に生成されたコードとしてコンパイル時に識別されたメタデータによって処理されます。

  • 動的プロセス、コードは、射出反射例を用いて、例えば、ランタイムを実行して、特定された処理動的メタデータ

三回言うべき重要なこと:

メモは、メタデータのみであり、ビジネス・ロジックは何の関係もありません!

メモは、メタデータのみであり、ビジネス・ロジックは何の関係もありません!

メモは、メタデータのみであり、ビジネス・ロジックは何の関係もありません!

第三に、注釈の種類

  • 一つは、Javaが非推奨と@SuppressWarnings @オーバーライドは、これらのノートは、コンパイラでマークされた、無視するよう警告を示し、廃止されたクラスやメソッドを示す、書き換え方法を示すために使用されている、@を含め、標準の注釈が付属していますデバイスがチェックされます。

  • ターゲット注釈範囲を示すために使用@クラス員の注釈は、注釈メタデータアノテーションを保持@を含む、アノテーションを定義するために使用され、ターゲット@、継承@、文書化@、保持注釈@、位相のために保持示され、かどうかJavadocの生成を示すために使用される文書化@、継承可能な注釈を識別するために使用さ@Inherited。

  • カスタム注釈のための一つは、彼らのニーズ注釈に従って定義することができ、およびメタデータのアノテーションは、カスタム注釈に注釈を付けるために使用することができます。 

第四に、元のメモ

  • @target、 - 注釈がここで使用されていることを示しています。あなたがクリアされない場合は、コメントはどこにでも配置することができます。以下は、利用可能なパラメータの一部です。なお:注釈のプロパティに互換性がある、1つのプロパティのみを除く、すべての7のプロパティに注釈を付けたい場合は、あなたがターゲット定義された属性のすべてを含める必要があります。ElementType(のElementType ==>スコープの範囲):

    1. CONSTRUCTOR:コンストラクタを記述するために使用されます

    2. FIELD:フィールドを記述するために使用

    3. LOCAL_VARIABLE:記述するために使用されるローカル変数

    4. METHOD:方法はについて説明し

    5. パッケージ:パッケージの説明

    6. PARAMETER:記述するために使用されるパラメータ

    7. TYPE:クラス、(注釈のタイプを含む)インターフェース、または列挙宣言を説明するために

  • 注釈ライフサイクルの定義 - 保持、@。

         SOURCE      ソースステージに対応

         クラス         対応のコンパイルフェーズ

         RUNTIME      任意の時点では、上記2つのフェーズで構成します

  • @文書化、 - 簡単な注釈情報は、Javaのドキュメントを追加するかどうかを示すメモ、注釈をマーク。

  • Inherited- @ノートとサブクラスの関係を定義します

元のメモ

効果

リマーク

@目標

地元のノートの使用を指定します。

下記の

あなたはコメントは@Targetコメントであるとき、このコメントは、シーンの使用は限られていたことを理解することができます。ラベルへのアナロジーは、あなたがその上に場所に配置したいと、ラベルはもともと投稿されましたが、理由は@Targetの存在により、非常に特定の場所にそれを投稿し、そのような缶が唯一の方法で、クラス、メソッドのパラメータに掲載さなど。

@保持

説明生存期間の注釈

下記の

保持時間が掲示このラベルを指定することを説明する時にラベルを与えるために、@私たちは、このような方法で、理解深めることができます。タイムスタンプの蓋の上のラベルに@Retention対応は、タイムスタンプは、期間ラベルが掲載さを示しています。

@資料

ノートは文書化することができるかどうか

ノー

ではない、一般的に

@Inhrited

説明ノートは継承することができます

ノー

ではない、一般的に

第五に、実装のメモ

注釈がサポートする唯一の基本的なタイプ、文字列や列挙型。すべての属性がメソッドとして定義され、デフォルト値を提供することを可能にしていることに注意してください。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Todo {
   public enum Priority {LOW, MEDIUM, HIGH}
   public enum Status {STARTED, NOT_STARTED}
   String author() default "Yash";
   Priority priority()defaultPriority.LOW;
   Status status() default Status.NOT_STARTED;
}
@Todo(priority = Todo.Priority.MEDIUM, author ="Yashwant", status = Todo.Status.STARTED)
public void incompleteMethod1() {
  //Some business logic is written
  //But it’s not complete yet
}

第六に、注釈プロセッサ

これは、エンドJavaでこれらのアノテーションとそれを対処する方法であることを、非常に多くのノートが関連すると私たちの前に、使用ノートの中核であります

getAnnotationから、我々はjava.lang.Classの実現に見ることができますAnnotatedElementのの方法

MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class);
public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration,
                              Type,
                              AnnotatedElement

java.lang.reflect.AnnotatedElementすべてのプログラム要素(クラス、メソッド、およびコンストラクタ)親インターフェイス、クラスAnnotatedElementのその後反射ターゲットにより取得されたプログラムをインターフェース次の4つの方法は、プログラムのオブジェクトを使用することができ注釈情報訪問:

  方法1:T <T注釈延び> getAnnotation(クラス<T> annotationClass): 戻るタイプが存在しない場合、nullが返され、注釈を注釈のタイプを指定するために、既存のプログラム要素を変更します。
  方法2:注釈は、[] getAnnotations() :注釈プログラム上に存在するすべての要素を返します。
     方法3:ブールAnnotationPresent(クラスannotationClassある :. <?注釈を拡張>) プログラム要素上のノートの指定されたタイプを含むかどうかを判定し、リターン真存在し、そうでない場合はfalseを返す
  メソッド4:注釈[] getDeclaredAnnotations() :戻り直接本この要素のすべてのコメント。そして、このインタフェースの他の方法が、この方法では、継承された注釈を無視し、異なっています。(いかなる注釈がこの要素上に直接存在しない場合、長さゼロの配列が返される。)メソッドの呼び出し元は、返された配列を変更して自由であり、これは他の発信者によって返された配列に影響を及ぼさないであろう

アノテーションを使用して七例

@Override実装原則の春@Autowireアノテーションやメモで説明、分析するためにこのソース仮想マシンおよび基礎となる実装上の2つの記事の著者に感謝し、あなたが最後の二つのリンクが参考にジャンプすることができるものを教えてください。

そこから我々はより深く、理解することができるノートは、メタデータのみであり、ビジネス・ロジックは何の関係もありません!

すべてのビジネスロジックの代表注釈、コメントは反射によって、範囲および生存時間のアノテーションを宣言した後、当技術分野の注釈の効果を得るために、それ自体剥離、従ってパッケージ、クラス、メソッド、メンバーであります変数のビジネス・ロジック・オペレーション。

 

参考資料

原則Javaアノテーション(理解しやすいです)

Javaは、分析的な作品を注釈します

JAVA注釈メカニズムと原則

スプリングIOC分析原理ソース(@Autowired詳細原理:特定の属性および方法)(II)

多形性の観点から見て、Java仮想マシン - >(オーバーライドを書き換える)実装原理

公開された60元の記事 ウォン称賛57 ビュー80000 +

おすすめ

転載: blog.csdn.net/qixinbruce/article/details/89006163