Androidでの注釈入門編——Java注釈


1.注記の分類
  • 標準注記は、JDK 5の後に含まれる標準注記として、以下のいくつかの注記を含む.(annotation).Overideは、この関数が上書きされていることを示し、Deprecatedが上書きされていることを示します.この関数またはクラスが破棄され、SuppressWarningsが維持されていないことを示します.Javaコンパイラにこれらのメソッド、クラス、メンバーに対する警告
  • を閉じるように伝えます.
  • メタ注釈メタ注釈は、他の注釈をカスタマイズするための注釈を表し、以下の4種類がある.
    注釈
    使用例
    説明
    @Target
    @Target(ElementType.METHOD)
    注釈がどこで使用できるかを示す、可能なElementTypeパラメータは、CONTRUCTOR:コンストラクタの宣言FIELD:ドメイン宣言(enumインスタンスを含む)LOCAL_VARIABLE:ローカル変数宣言METHOD:メソッド宣言PACKAGE:パッケージ宣言PARAMETER:パラメータ宣言TYPE:クラス、インタフェース(注釈タイプを含む)またはenum宣言
    @Retention
    @Retention(RetentionPolicy.RUNTIME)
    注釈情報をどのレベルで保存する必要があるかを示します.オプションのRetentionPolicyパラメータには、SOURCE:注釈はコンパイラによってCLASSを破棄されます:注釈はclassファイルで使用可能ですが、VMによって破棄されるRUNTIME:VMは実行中に注釈を保持するため、反射機制で注釈の情報を読み取ることができます.
    @Documented
    @Documented
    注記をJavadocに含める
    @Inherited
    @Inherited
    子クラスが親クラスの注記を継承できるようにする
    .
  • メタ注釈に基づいてカスタマイズされた注釈
  • 2.カスタム注記
    要素のない注釈をマーク注釈(mark annotation)と呼び、次はマーク注釈です.
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MarkAnnotation {
    
    }

    次のMethodInfoは比較的完全な注釈です
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Inherited
    public @interface MethodInfo {
    
        String author() default "[email protected]";
    
        String date();
    
        int version() default 1;
    }

    MethodInfoの実装には以下の点がある
  • @interfaceによって定義され、注釈名はカスタム注釈名
  • である.
  • 注記構成パラメータ名は注記クラスのメソッド名であり、a.すべてのメソッドにはメソッド体がなく、パラメータには修飾子がなく、実際にはpublic&abstract修飾子のみが許可され、デフォルトはpublicであり、投げ異常は許されないb.メソッドの戻り値は基本タイプ、String、Class、annotation、enumerationまたは彼らの1次元配列cのみである.属性を認識し、value()関数を直接使用できます.1つの属性もMark Annotation
  • であることを示していません.
  • defaultを追加してデフォルト値
  • を表すことができます.
  • 注釈の使用可能なタイプには、すべての基本タイプ、String、Class、enum、Annotation、以上のタイプの配列形式があります.要素には不確定な値、すなわちデフォルト値があるか、注釈を使用するときに要素の値が提供されます.要素はnullをデフォルト値として使用できません.注釈は1つの要素のみで、その要素の名前はvです.alueの場合、注記を使用する場合は「value=」を省略し、必要な値を直接書けばよい.
  • 3.注記の使用
    また、上記のMethodInfoを例にとると、この注釈はメソッド注釈です.
    public Example{
        @MethodInfo(author="gaoyan", date="2015-05-30", version=2)
        public boolean isGoodExample() {
            return true;
        }
        @MethodInfo(date="2015-05-30")
        public boolean isBadExample() {
            return false;
        }
    }

    4.注記の解析
  • 実行時のAnnotation解析@Retention(RetentionPolicy=RUNTIME),@Target(ElementType.METHOD)のAnnotationについては、以下のAPI解析を用いることができる:
  • method.getAnnotation(AnnotationName.class);
    method.getAnnotations();
    method.isAnnotationPresent(AnnotationName.class);

    その他の@TargetはFieldのように、Classメソッドは類似しています.
  • getAnnotation(AnnotationName.class)は、1つのTargetが複数のAnnotationによって修飾できるため、そのTargetのあるAnnotationの情報を得ることを示す.
  • getAnnotations()は、このTargetのすべてのAnnotation
  • を得ることを示す
  • isAnnotationPresent(AnnotationName.class)は、TargetがAnnotationによって修飾されているかどうかを示す
  • public static void main(String[] args) {
        try {
            Class cls = Class.forName("Example");
            for (Method method : cls.getMethods()) {
                MethodInfo methodInfo = method.getAnnotation(
    MethodInfo.class);
                if (methodInfo != null) {
                    System.out.println("method name:" + method.getName());
                    System.out.println("method author:" + methodInfo.author());
                    System.out.println("method version:" + methodInfo.version());
                    System.out.println("method date:" + methodInfo.date());
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
  • コンパイル時のAnnotation解析コンパイル時のAnnotationとは@RetentionがCLASSのAnnotationであり、
  • カスタムクラス統合AbstractProcessor
  • は、プロセス関数
  • を書き換える.
    MethodInfoの@RetentionがCLASSであると仮定すると、解析例は次のとおりです:
    @SupportedAnnotationTypes({ "MethodInfo" })
    public class MethodInfoProcessor extends AbstractProcessor {
    
        @Override
        public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
            HashMap<String, String> map = new HashMap<String, String>();
            for (TypeElement te : annotations) {
                for (Element element : env.getElementsAnnotatedWith(te)) {
                    MethodInfo methodInfo = element.getAnnotation(MethodInfo.class);
                    map.put(element.getEnclosingElement().toString(), methodInfo.author());
                }
            }
            return false;
        }
    }

    SupportedAnnotationTypeはこのProcessorが処理するAnnotationの名前を表します.process関数のパラメータannotationsは処理するAnnotationsを表し、パラメータenvは現在または以前の実行環境process関数の戻り値を表し、このannotationsがこのProcessorに受け入れられるかどうかを表します.後続のサブを受け入れるrocessorはこのAnnotatioに対してns処理
  • 参照https://github.com/android-cn/android-open-project-analysis/blob/master/tech/annotation.md
  • 参照http://www.cnblogs.com/pepcod/archive/2013/02/16/2913474.html