[再印刷]アノテーションコア知識の要約

 

アノテーションコア知識の概要

免責事項:この記事は従って、ブロガーオリジナル記事です。 CC 4.0 BY-SAの 著作権契約を、再現し、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_45674354/article/details/102864317

1.はじめに

数年前、私たちは2つのプロジェクトを実行し、一度春ブーツという同僚のノウハウを尋ね、まだ構造体が、同僚は、適切なノートを開発するために使用されていないと言います。答えは正確に右ではなく、客観春ブーツから新しいことへの人々のために最も目を引く注釈されているが。さて、今日は、Java言語のコア機能を見て - 注釈。

2.コメントは何ですか

public @interface Anno { }

上記の単純な文のノートです。これは、クラス、インタフェース、メソッド、変数にコメントすることができます。メソッド、インターフェイス、クラス、フィールド、または結合のための追加のメタデータソースを割り当てられたコメントを追加することによって。

3.注釈
の注釈によって、私たちは、コンパイラの警告とエラーの操作を教えてくれたり、実行時に動作を確認し、コンパイル時にソースコードを変更することができます。図5は、実質的に構築され、JDK注釈処理コードチェックを提供します。

  • 書き換えるための方法または交換の振る舞い継承されたメソッドをマークする@Override。あなたはノートせずに親クラスのメソッドをオーバーライドする場合、いくつかの警告がトリガされます。
  • @SuppressWarningsは、私たちが警告のコードの特定の部分を無視すべきであるということを意味します。潜在的に危険な型変換の警告がオフに無視します。
  • @Deprecatedは、古くなって、クラスを表すために使用し、推奨されません。あなたがコンパイラを使用するように強制されている場合は、コンパイル時に警告が表示されます。
  • @Safevarargs抑制「ヒープ汚染」の警告。「ヒープ汚染」は、オブジェクトがジェネリックと変数に代入することなく、一般的な場合に発生する問題の種類を指します。あなたは見たくない場合は、この警告は抑制するために、このアノテーションを使用することができます。
  • 8つの新しいノートは、唯一のインターフェイスを識別するためのインターフェイスアップに作用することができます@FunctionalInterfaceのJavaは、関数インタフェースです。インタフェースで表現されたJavaインタフェース機能は、抽象メソッドを持つことができます。インタフェースは、このコメントの変更である場合は、2番目の抽象メソッドを追加した場合はコンパイルされません。

いくつかのメタデータアノテーションは、あなたが書くのロジックに渡すことができます。注釈@RequestMappingスプリングMVCの一般的な例として、我々は、パスマッチング要求を介してパスの経路か否かが判断されるパスのパスパラメータ値、スプリングMVCを通過することができます。現在、フレームワークの多くは、このような春、休止状態、ダボと上のように注釈を、依存しています。

4.元のメモ

メタ注釈は、他の注釈付きのノートに適用することができます。強化またはターゲット注釈機構の構成に。JDKは現在、5元のノートを提供しています。カスタムアノテーションを開発する必要がある場合は、それらに精通していることを確認してください。

  • @Retentionはノートだけを変更するために使用することができ、注釈はどのくらいに指定するように変更することができます。3つの戦略アウトセット:
  • このような方針の下RetentionPolicy.SOURCE注釈が修正注釈を反映することによって取得することができず、後に廃棄コンパイルし、ソースコード内にのみ存在することができる修飾されています。
  • この戦略の下RetentionPolicy.CLASS修正ノートはバイトコードファイルにコンパイルされます。しかし、JVMは、コメントを得るために変更することはできません。これは、あなたが任意の保持ポリシーを追加することなく、注釈を宣言するときに、デフォルトでポリシーを指定し、デフォルト値です。
  • RetentionPolicy.RUNTIMEの下で、この戦略は、唯一のバイトコードファイルにコンパイルのメモを変更することができます。そして、JVMも変更注釈付きのノートを取得することができます。そして、プログラムコードはまた、いくつかのメタ情報が注釈注釈反射によって変更され得ることができます。
  • @targetは、ターゲット・タイプが変更注釈で変更するために使用されます。コメントは、ターゲット・タイプをクリアするように変更することができる場合は、変更のみのタイプを指定します。列挙のElementTypeで指定されました。
  • TYPEは、クラス、インタフェース、列挙型を修飾することができます。
  • フィールドは、メンバ変数を変更することができ、列挙の定数が含まれています。
  • METHODのみ修正方法。
  • PARAMETERはパラメータのみを変更します。
  • コンストラクタは唯一のコンストラクタを変更することができます。
  • LOCAL_VARIABLEは、ローカル変数を変更します。
  • ANNOTATION_TYPEは、コメントだけを変更します。
  • PACKAGEはパッケージ定義を変更します。それはpackage-info.javaでは、
  • TYPE_PARAMETERのJava 8の新しいノートは宣言型パラメータに書き込むことができることを示しています。Typeパラメータ宣言など:,
  • TYPE_USEのJava 8の新しい注釈は、使用のタイプの任意の場所で再び使用することができます。
  • 注釈ノートによって変更@Documentedは、Javadocドキュメントツールを抽出することができます。
  • 注釈ノートによって変更@Inheritedは継承されてきました。ノートにはいくつかの重要なポイントの間で、ここで最初のクラスではなくインタフェースで、この継承を体現し、ノートがJVMに表示されている必要があります。それは仕事にRetentionPolicy.RUNTIMEに@Retentionです。
  • @Repeatable Javaの新しい8。これに先立ち、同じ要素にコメントして一度だけ表示されます。@Repeatableは、要素の上、コメントを複数回行うことができます。

5.カスタム注釈

カスタムインターフェイスとカスタム注釈は似ていますが、いくつかの違いがありますが、あなたが実際にカスタム注釈メタアノテーションノートを開発する必要があります。非抽象宣言メンバ変数にする方法と、すべてのタイプがサポートされていないを参照してメンバ変数コメントは、現在のところ以下のタイプをサポートしています。

  • すべての基本的なタイプ(int型、float型、ブール、バイト、ダブル、文字、ロング、ショート)
  • クラス(如:<?>クラス或クラス)
  • 列挙型Javaの列挙型
  • 注記
  • ここでは、コメントをカスタマイズします:
  • / * * 
     *法上のクラス、インターフェイス、列挙、注釈でマークを宣言することができます。
     * JVMランタイム可視および文書を生成することができる
     * 
     *ダックス@author 
     * @since 17:2019年9月4日27 
     * / 
    @Documented 
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE、ElementType.METHOD})
    公衆アノ{@interface
      / * * 
     *値メソッド名と注釈値は、属性を宣言した場合に必要な、場合にのみ宣言
     *値は省略することができ、@Anno(「アノ」)が@Anno(値=「アノ」)に相当する
     * 
     * @return文字列
     * / 
     String値(); 
     / * * 
     * String属性は、デフォルト値を持っています。
     *名前に明示的に宣言されていない場合、デフォルトは「」
     *宣言デフォルト値は、デフォルト+デフォルトで宣言されている
     * 
     で* @return文字列
     * /
     名文字列()デフォルト 「」;
      / * * 
     *クラスのtype属性は、デフォルト値はありません。他のタイプの例には、もはやサポートされていない
     * 
     クラス@return * 
     * / 
     クラス <?> Clazzを(); 
    }

     

メタデータアノテーションを取得する方法
すべてのノートのサブクラスをjava.lang.annotation.Annotationあります。唯一のRetentionPolicyは、反射によって、実行時のコメントに取得することができます。アノテーション要素をキャプチャするパケットを処理するために、反射AnnotatedElementのインターフェースを提供します。インタフェースは、オブジェクトのように、クラス、メソッド、コンストラクタプログラム要素のインタフェースの親です。それは限り取得プログラム要素オブジェクトは、既存のノートを処理できるようになります。主な方法は以下のとおりです。

  • ブールisAnnotationPresent(クラス<?延び注釈> annotationClass)annotationClass注釈のタイプかどうかを決定します。
  • T getAnnotation(クラスannotationClass)パラメータが(annotationClass)注釈が指定された現在の要素のタイプに存在する場合は、そうでない場合、それはNULLを返し、対応する注釈を返します。
  • 注釈[] getAnnotations()この要素のすべての注釈を返します。要素が注釈されていない場合、戻り値は長さゼロの配列です。このメソッドの呼び出し元は、返された配列を自由に変更でき、それは他のアレイが呼び出し元に返される影響はありません。
  • T [] getAnnotationsByType(クラスannotationClass)要素に関連付けられた注釈を返します。この要素に関連付けられた注釈は、0の値は、配列の長さを返していない場合。getAnnotation(クラス)、メソッド検出し、その引数は、注釈(JLS 9.6)の再利用可能なタイプであるかどうか、もしそうなら、型注釈のコンテナまたは複数の注釈を見つけること「を通して見ている」をしようとしていることから、この方法が異なります。このメソッドの呼び出し元は、返された配列を自由に変更でき、それは他のアレイが呼び出し元に返される影響はありません。参考@Repeatable。
  • T getDeclaredAnnotation(クラスannotationClass)パラメータが音符の種類を指定した場合、それ以外の場合はNULLを返し、対応する戻り注釈現在の要素上に直接存在しています。このメソッドは継承された注釈を無視します。(あなたがこの要素の上に直接コメントしていない場合は、nullが返されます。)
  • T [] getDeclaredAnnotationsByType(クラスannotationClass)が提供されていますが、無視を繰り返しノートは注釈を継承しました。
  • 注釈[注釈が繰り返さ注釈を取得することができないという違いと上記] getDeclaredAnnotations()。

基本的にインターフェースを学習した後、この方法は、メタデータ注釈を取得する方法を知っているかもしれません。レッツ・書き込み例または例と庵野ノート上記:

/ * * 
 *クラスマーク注釈付き
 * * / 
@Anno(こんにちはパブリック クラスはFoo {}
 / * * 
 、*クラスFooクラスによって取得
 された上記*、値のプロセス値に応じて求めることができます
 * @author DAX 
 * @since 2019年9月4日夜09時17分
 * / 
パブリック クラスメイン{
  公共 静的 ボイドメイン(文字列[]引数){ 
 アノ注釈 =フー。クラス .getAnnotation(アノ。クラス); 
 文字列値 = annotation.value(); 
 。システムOUTの .println("値= " + 値); 
 }

 

要約
我々は体系的にノートをまとめた今日、私はあなたが注釈の体系的な理解を持っている必要が信じています。

出典:ナゲッツリンク:https://juejin.im/post/5db79e6c6fb9a0206f47bfd2

プライベートの手紙の返事「情報」、インタビューブックの「Javaコア知識仕上げた.pdf」を」取得JVM、ロック、並行性の高い、反射、春原理カバー

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12000521.html