Javaノート5-注記

9484 ワード

目次
  • 注釈
  • を使用
  • 定義注記
  • 処理注記
  • メモは廖雪峰の公式サイト-Javaチュートリアル-注釈から抜粋した.
    注釈の使用
    注記(Annotation)は、Javaソースコードのクラス、メソッド、フィールド、パラメータの前に置かれる特殊な「注釈」です.
    // this is a component:
    @Resource("hello")
    public class Hello {
        @Inject
        int n;
    
        @PostConstruct
        public void hello(@Param String name) {
            System.out.println(name);
        }
    
        @Override
        public String toString() {
            return "Hello";
        }
    }
    

    Javaの注記は、次の3つに分類されます.
  • 第1のクラスは、コンパイラによって使用される注釈であり、例えば、
  • @Override:                   ;
    @SuppressWarnings:                。
               .class  ,              。
    
  • の第2のクラスは、classをロードするときにclassを動的に修正し、特殊な機能を実現するツール処理.classファイルで使用される注釈です.このような注釈は.classファイルにコンパイルされますが、ロードが終了するとメモリには存在しません.このような注釈は、一般的には自分で処理する必要はありません.
  • の第3のクラスは、プログラムの実行中に読み取ることができる注釈であり、ロード後もJVMに存在し続け、これも最も一般的な注釈である.たとえば、@PostConstructが構成されているメソッドは、構築メソッドが呼び出された後に自動的に呼び出されます(これはJavaコードが注釈を読み取る機能で、JVMは注釈を認識しません).

  • 注記を定義する場合は、構成パラメータを定義することもできます.構成を指定しないパラメータはデフォルト値を使用します.構成パラメータは次のとおりです.
  • すべての基本タイプ;
  • String;
  • 列挙タイプ;
  • 基本タイプ、String、Class、および列挙された配列.
  • Classタイプとその配列.

  • 構成パラメータは定数でなければならないため、上記の制限は、注釈が定義時に各パラメータの値を決定したことを保証します.
    public class Hello {
        @Check(min=0, max=100, value=55)
        public int n;
    
        @Check(value=99)
        public int p;
    
        @Check(99) //     @Check(value=99)
        public int x;
    
        @Check //           
        public int y;
    }
    

    注釈の定義
    Java  @interface    :
    
               ,      value  ;
    
        @Target   Annotation       ;
    
        @Retention(RetentionPolicy.RUNTIME)        Annotation
    

    注記のパラメータは、パラメータなしメソッドと同様にdefaultでデフォルト値を設定できます(強く推奨).最も一般的なパラメータはvalueと命名する必要があります.
    public @interface Report {
        int type() default 0;
        String level() default "info";
        String value() default "";
    }
    

    メタ注釈には、メタ注釈(meta annotation)と呼ばれる他の注釈を修飾する注釈があります.
    @Targetで最もよく使われるメタ注記は@Targetです.@Targetを使用して、定義された注記Annotationをソースコードに適用できる場所を定義します.
  • クラスまたはインタフェース:ElementType.TYPE;
  • フィールド:ElementType.FIELD;
  • 方法:ElementType.METHOD;
  • 構造方法:ElementType.CONTRUCTOR;
  • メソッドパラメータ:ElementType.PARAMETER.

  • たとえば、注記@Reportをメソッドで使用できるように定義するには、@Target(ElementType.METHOD)を追加する必要があります.
    @Target(ElementType.METHOD)
    public @interface Report {
        int type() default 0;
        String level() default "info";
        String value() default "";
    }
    

    注記を定義@Reportはメソッドまたはフィールドで使用できます.@Target注記パラメータを配列{ElementType.METHOD,ElementType.FIELD}に変更できます.
    @Target({
        ElementType.METHOD,
        ElementType.FIELD
    })
    public @interface Report {
        ...
    }
    

    @Retentionのもう一つの重要なメタ注記@RetentionはAnnotationのライフサイクルを定義します.
  • コンパイル期間のみ:RetentionPolicy.SOURCE;
  • classファイルのみ:RetentionPolicy.CLASS;
  • 運行期間:RetentionPolicy.RUNTIME.

  • @Retentionが存在しない場合、AnnotationのデフォルトはCLASSです.通常はRUNTIMEと定義されます.
    @Repeatable@Repeatableというメタ注記を使用して、Annotationが繰り返し可能かどうかを定義します.この注釈の応用は特に広くない.詳細は@Repeatableを参照してください.
    @Inherited@Inheritedを使用して、子クラスが親定義のAnnotationを継承できるかどうかを定義します.@Inheritedは@Target(ElementType.TYPE)タイプのannotationのみに有効であり、classの継承のみに対してinterfaceの継承は無効である.
    Annotationの最初のステップを定義する方法をまとめ、@interfaceで注釈を定義します.第2歩、パラメータ、デフォルト値を追加します:最もよく使われるパラメータをvalue()と定義して、すべてのパラメータができるだけデフォルト値を設定することをお勧めします;ステップ3では、@Targetと@Retentionを設定する必要があるメタ注釈で注釈を構成します.通常、@RetentionはRUNTIMEに設定されます.なぜなら、カスタマイズされた注釈は通常、実行期間中に読み取る必要があるからです.一般的に@Inheritedと@Repeatableを書く必要はありません.
    注釈の処理
    運転期間中にRUNTIMEタイプの注記を反射して読み取ることができます.@Retention(RetentionPolicy.RUNTIME)を漏らさないように注意してください.そうしないと、運転期間はこの注記を読み取ることができません.
    注記をプログラムで処理することで、次の機能を実現できます.
  • JavaBeanの属性値を規則的にチェックする.
  • JUnitは@Testタグのテスト方法を自動的に実行します.

  • ちょっとこまごましたので、使うときに見てください.詳細は注釈の処理を参照してください.サイトの原文のコメントを読むと、収穫があります.