Java注記-基礎

3862 ワード

注記は、クラス、メソッド、パラメータ、変数、コンストラクタ、およびパッケージ宣言に適用される特殊な修飾子です.
公式の解釈は以下の通りです.
注釈は、プログラムコードを解釈するためのデータを提供する一連のメタデータですが、注釈は解釈されたコード自体の一部ではありません.注記は、コードの実行効果に直接影響しません.
注釈には多くの用途があります.主に以下の通りです.
  • はコンパイラに情報を提供する:コンパイラは注釈を利用してエラーと警告情報
  • を検出することができる.
  • コンパイルフェーズ時の処理:ソフトウェアツールは、注釈情報を利用してコード、Htmlドキュメントを生成したり、他の対応する処理をしたりすることができます.
  • 実行時の処理:一部の注釈はプログラム実行時にコードの抽出を受け入れることができ、注釈はコード自体の一部ではないことに注意すべきである.

  • 注釈はラベルのようなもので、必要な場所に貼ることができるという文章を見た.よく考えてみると確かに適切で、記録しています.
    注記の定義:@interfaceキーワード定義を使用します.
    public @interface TestAnnotation{
    }

    注記の定義はインタフェースの定義とよく似ていますが、@記号が1つ増えただけです.
    注記の使用:
    @TestAnnotation
    public class Users{
    }

    メタ注記:
    は、他の注釈を注釈するための基本的な注釈です.注釈クラスに別の注釈クラスを使用すると、使用される注釈クラスはメタ注釈と呼ばれます.
    JAvaには主に4つのメタ注記があります:@Retention、@Documented、@Target、@Inherited
    @Retention:英語の翻訳は保留、保持;注記の保存ポリシー(ライフサイクル)を定義します.
    値は次のとおりです.
  • RetentionPolicy.SOURCE注記はソースコードにのみ存在し、コンパイラがコンパイルされると破棄されます.したがって、これらの注釈はclassバイトコードに書き込まれません.@Override,@SuppressWarningsはいずれもこのような注釈に属する.
  • RetentionPolicy.CLASS注記はclassバイトコードにコンパイルされますが、クラスのロード時に破棄され、JVMにロードされません.注記のデフォルトでは、この方法が使用されます.
  • RetentionPolicy.RUNTIME注記は、プログラムが実行されるまで保持され、JVMにロードされるため、反射メカニズムを使用して注記の情報を読み取ることができます.カスタム注釈では、通常この方法が使用されます.
  • @Retention(RetentionPolicy.RUNTIME)
    public @interface TestAnnotation{}

    @Documented:注釈情報をjavaドキュメントに追加するかどうかを示します
    @Target:注釈がどのような場所で使用できるかを示しますが、明確に指摘されていない場合は、その注釈をどこにでも置くことができます.
    値の範囲は次のとおりです.
  • ElementType.ANNOTATION_TYPE//注記
  • ElementType.CONTRUCTOR//構築方法
  • ElementType.FIELD//属性
  • ElementType.LOCAL_VARABLE//ローカル変数
  • ElementType.METHOD//方法
  • ElementType.PACKAGE//バッグ
  • ElementType.PARAMETER//メソッド内のパラメータ
  • ElementType.TYPE//クラス、インタフェース、列挙
  • などのタイプに注釈を付けることができます.
    @Inherited:継承、遺伝;クラスが親を継承する注釈を表し、クラス要素にのみ有効です.
    たとえば、親Aには注記TestAnnotationがあり、@Inherited宣言を使用して子Bが親Aを継承すると、クラスBは親Aの注記TestAnnotationも継承します.
    注記のプロパティ
    完全な注記には、次のようなプロパティも含まれます.プロパティ名の後にカッコ()を付ける必要があります.
    注意:属性のタイプは、8つの基本データ型の追加クラス、インタフェース、注釈、およびそれらの配列でなければなりません.
    ​
    public @interface TestAnnotation{
    String name() default "admin";// name       admin
    int userId();
    }
    
    ​

    注釈の使用:
    @TestAnnotation(name="test",userId=1)
    
    public class Test(){}

    注釈にvalueという属性が1つしかない場合は、注釈の後に値を追加するだけで、属性名を書く必要はありません.
    注記に属性がない場合は、カッコなしで「@注記名」と書くだけです.
    カスタム注釈を使用すると、これらのAnnotationは自分では有効になりません.開発者が適切なコードを提供してAnnotation情報を抽出して処理する必要があります.
    注釈の内容を取得(ラベルを引き裂いてラベルの内容を表示)
    注記を呼び出すには、反射メカニズムを使用する必要があります.
    /**
    *isAnnotationPresent       Test         ,   TestAnnotation
    **/
    boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
            if ( hasAnnotation ) {
    //getAnnotation             ,
    //    getAnnotations()             
                TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
                System.out.println("userId:"+testAnnotation.userId());
                System.out.println("name:"+testAnnotation.name());
            }

    属性とメソッドで使用される注釈の類似性を取得します.
    //            
    Field userName = Test.class.getDeclaredField("userName");
    userName.setAccessible(true);
                
    TestAnnotation testAnnotation= userName.getAnnotation(TestAnnotation.class);
    if ( testAnnotation!= null ) {
       System.out.println("annotaiton value:"+testAnnotation.name());
    }
    //         
      Method testMethod = Test.class.getDeclaredMethod("testMethod");
      if ( testMethod != null ) {          
          Annotation[] a = testMethod.getAnnotations();
          for( int i = 0;i < a.length;i++) {
             System.out.println("method annotation:"+ a[i].annotationType().getSimpleName());
          }
      }

    最後に参考のリンクを添付します:リンク