■
相変わらず続かない・・・
仕事が忙しすぎるせいかな。。
独自アノテーションの作成
アノテーションの宣言は @interface キーワードを用います。
また、java.lang.annotation.Annotationを暗黙的に継承する為、別のアノテーション
を継承させるといった使い方はできません。
①メンバを持たないアノテーション
public @interface AnnotationTest { }
②1つのメンバを持つアノテーション
public @interface AnnotationTest { String value(); }
特にメンバが1つの場合、valueというメンバを定義します。
③複数のメンバを持つアノテーション
public @interface AnnotationTest { int id(); String[] names(); String comment() default "no comment."; // デフォルトを指定すると省略できる AnnotationTypeEnum type(); // 列挙型 } public enum AnnotationTypeEnum { TYPE_1, TYPE_2, TYPE_3 }
※.列挙型を指定した例
※.デフォルト値を指定すると省略可能。(デフォルト値の指定には、defaultキーワードを使う。)
また、メソッドの戻り値には、プリミティブ型、String、Class、列挙型、アノテーション型
しか指定できないとのこと。
メタアノテーションとは?
以下のものが、java.lang.annotationパッケージに定義されています。
①Target
②Retention
③Documented
④Inherited
①Target
アノテーション型の宣言にのみ利用できるもので
アノテーションの対象を指定します。
java.lang.annotation.ElementType.ANNOTATION_TYPE - アノテーション
java.lang.annotation.ElementType.CONSTRUCTOR - コンストラクタ
java.lang.annotation.ElementType.FIELD - フィールド
java.lang.annotation.ElementType.LOCAL_VARIABLE - ローカル変数
java.lang.annotation.ElementType.METHOD - メソッド
java.lang.annotation.ElementType.PACKAGE - パッケージ
java.lang.annotation.ElementType.PARAMETER - パラメータ
java.lang.annotation.ElementType.TYPE - クラス、インタフェース、列挙型
import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface AnnotationTest { String value(); }
このアノテーションは、フィールド以外に指定するとコンパイル時に怒られます。
②Retention
アノテーション型の宣言にのみ利用できるもので
アノテーションの利用局面を指定します。
java.lang.annotation.RetentionPolicy.CLASS
- コンパイル後、クラスファイルに記録される。しかし、実行時に VM に読み込まれない。
java.lang.annotation.RetentionPolicy.RUNTIME
- コンパイル後、クラスファイルに記録される。実行時に VM に読み込まれる。
java.lang.annotation.RetentionPolicy.SOURCE
- コンパイル時に破棄される。
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface AnnotationTest { String value(); }
デフォルトはCLASSが指定される。
その為、実行時にリフレクションAPIを使用して、アノテーションにアクセスしたようなら
RUNTIME を指定する必要がある。
しかし、SOURCEやCLASSのアノテーションに関してもapt(Annotation Processor Tool)
というコマンドが提供されており、パーサの役割を果たしてくれるとのこと。
暇があればまた調べてみよう。