Javaシリーズの注釈

3616 ワード

Javaシリーズの注釈
Java注釈(Annotation)はJava注釈、メタデータとも呼ばれ、Java 1.5の後に加わった特殊な文法である.注釈によってJava中のクラス、方法、属性、パラメータ、パッケージなどを注釈することができ、反射原理によってこれらのメタデータにアクセスすることができ、注釈の使用はプログラムの正常な運行に影響しない.コンパイラ警告などのアシストツールにのみ影響します
注記機能
  • コンパイラは、注釈を使用してエラーを検出し、警告を取り消すことができます.
  • 注釈を使用すると、ButtferKnifeが注釈を使用してfindViewByIdを簡略化するなど、特定のコードを生成することができる.
  • いくつかの注釈は、実行時にチェックおよび操作することができる.

  • 注記の定義
    注記の定義は@interfaceをキーワードとして使用しますが、実際にはjava.lang.annotation.Annotationインタフェースが自動的に継承されていることを示しています.定義形式は以下の通りです.
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AuthValidators {
    
        @AliasFor("value")
        AuthValidator[] validators() default {};
    }

    内蔵注記
  • @Overrideは現在のメソッドがスーパークラスのメソッドを上書きすることを示し、コンパイル時にフォーマットチェック
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
  • を行う.
  • @Deprecatedは、クラスまたはメソッドが使用を推奨しないことを示し、古いとマークされていますが、
    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
        String[] value();
    }
  • を使用することができます.
  • @SuppressWarningsは、不適切なコンパイラ警告情報
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    public @interface Deprecated {
    }
    元注記
  • を閉じることを示します.
  • @Target
  • @Retention
  • @Documented
  • @Inherited@Target@Targetは注釈の使用範囲を記述するために使用され、その説明は以下の
  • である.
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Target {
        ElementType[] value();
    }

    @Target宣言では、@Target注釈を使用するには、次のように、特定のJavaメンバー、すなわち注釈を使用する場所を指定する必要があります.具体的には、列挙ElementTypeで定義されています.
    public enum ElementType {
        TYPE,           // 、  、  、  
        FIELD,          //  (      ) 
        METHOD,         //  
        PARAMETER,      //   
        CONSTRUCTOR,    //    
        LOCAL_VARIABLE, //    
        ANNOTATION_TYPE,//  
        PACKAGE,        // 
    
        /**
         *     
         * @since 1.8
         */
        TYPE_PARAMETER,
        TYPE_USE
    }

    @Retention
    @Retentionは、注釈の情報をどのレベルで保存するかを示し、次のように宣言します.
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Retention {
        /**
         * Returns the retention policy.
         * @return the retention policy
         */
        RetentionPolicy value();
    }

    @Retentionの宣言から分かるように、@Retentionを使用する場合は、次のような値の保存celue(RetentionPolicy)を指定する必要があります.
    public enum RetentionPolicy {
        SOURCE,  //        ,        
        CLASS,   //    ,        ,    class    
        RUNTIME  //            class  ,       ,            
    }

    @Documented & @Inherted
    @Documentedと@Inheritedには構成パラメータがなく、タグ注記です.@Documentedは、この注記をユーザードキュメントに表示することを示し、@Inheritedは、この注記がクラスでのみ有効であり、その注記がクラスに継承されることを示します.
    タイプ注記
    メタ注記の説明ではJava 8からタイプ注記が追加されていることがわかりますが、この注記を注記@Targetで使用すると、@TargetでTYPE_を指定するなど、対応する任意の場所で使用できることを示します.この注記は、@TargetでTYPE_を指定するなど、カスタムタイプの宣言で使用できます.USEは、Java開発者がタイプ注釈と関連プラグイン(Checker Framework)を使用してコンパイル中に実行時の異常をチェックするのに便利であるため、任意のタイプの前にクラス間を追加できます.
    以下、指定TYPE_をそれぞれ定義するPARAMETERとTYPE_USEの注釈は、具体的には以下の通りです.
    //1. TYPE_PARAMETER
    @Target(value = {ElementType.TYPE_PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TypeParameterAnnotation {
        String value();
    }
    //2. TYPE_USE
    @Target(value = ElementType.TYPE_USE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TypeUseAnnotation {
    }