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)と呼び、次はマーク注釈です.
次のMethodInfoは比較的完全な注釈です
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を例にとると、この注釈はメソッド注釈です.
4.注記の解析実行時のAnnotation解析@Retention(RetentionPolicy=RUNTIME),@Target(ElementType.METHOD)のAnnotationについては、以下のAPI解析を用いることができる:
その他の@TargetはFieldのように、Classメソッドは類似しています. getAnnotation(AnnotationName.class)は、1つのTargetが複数のAnnotationによって修飾できるため、そのTargetのあるAnnotationの情報を得ることを示す. getAnnotations()は、このTargetのすべてのAnnotation を得ることを示す isAnnotationPresent(AnnotationName.class)は、TargetがAnnotationによって修飾されているかどうかを示す コンパイル時のAnnotation解析コンパイル時のAnnotationとは@RetentionがCLASSのAnnotationであり、 カスタムクラス統合AbstractProcessor は、プロセス関数 を書き換える.
MethodInfoの@RetentionがCLASSであると仮定すると、解析例は次のとおりです:
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
注釈
使用例
説明
@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
子クラスが親クラスの注記を継承できるようにする
.
要素のない注釈をマーク注釈(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の実装には以下の点がある
また、上記の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.注記の解析
method.getAnnotation(AnnotationName.class);
method.getAnnotations();
method.isAnnotationPresent(AnnotationName.class);
その他の@TargetはFieldのように、Classメソッドは類似しています.
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();
}
}
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処理