JavaGold資格取得に向けた勉強記第18回は「メタ・アノテーション」についてです。
ここではJavaGold資格取得に向けて勉強している駆け出しプログラマーの私がアウトプットの意味も込めて、「メタ・アノテーション」について紹介させていただきます。
JavaGold資格取得に向けて勉強されている方や、プログラマー初心者の方にとって参考になれば幸いです!
メタ・アノテーションとは?
Javaのアノテーションは、プログラムにメタデータを提供し、特定の振る舞いを制御するための強力な機能です。
前回の記事で独自アノテーションの作成方法についてもまとめていますので一緒にご覧になってください!
メタ・アノテーションは、アノテーションを定義するためのアノテーションです。つまり、通常のアノテーションがコードにメタデータを提供するのに対し、メタ・アノテーションはアノテーションそのものに対する情報を与えます。
Javaで提供されている主要なメタ・アノテーションには以下のものがあります
@Retention
: アノテーションがどの程度の期間保持されるかを指定します(ソース、クラス、または実行時)。@Target
: アノテーションがどの要素に適用可能かを指定します(メソッド、クラス、フィールドなど)。@Documented
: アノテーションがJavadocにドキュメント化されることを指定します。@Inherited
: アノテーションが継承されるかどうかを指定します。
@Retentionメタアノテーション
@Retention
メタアノテーションは、アノテーションがソース、クラス、または実行時に保持されるかを指定します。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// アノテーションの本体
}
アノテーションの保有期間を表すには、java.lang.annotation
パッケージのRetentionPolicy
という列挙型を使います。
この列挙型には3つの列挙子が用意されています。
種類 | 内容 |
---|---|
CLASS | アノテーションに関する情報はクラスファイルには持っているものの、実行時に破棄される。 クラスファイルに事前処理するようなプログラムを作る時に使用する。 |
RUNTIME | 実行時までアノテーションに関する情報を保持する。 実行時にアノテーションを処理するために使用する。 |
SOURCE | コンパイル時にアノテーションに関する情報は破棄される。 コンパイラにアノテーションを処理させたい時に使用する。 |
プログラマーがRetentionPolicy
を使用するのは、実行時に何らかの処理をするプロセッサを作る時であるため、RUNTIME
を使うことがほとんどです。
RetentionPolicy.RUNTIME
を指定することで、アノテーションが実行時にも利用可能となります。
@Targetアノテーション
@Target
アノテーションはアノテーションが適用できる対象要素(クラス、メソッド、フィールドなど)を指定します。
@Target
アノテーションの注釈パラメータに渡す列挙子型であるjava.lang.annotation.ElementType
の列挙子には、次の表に挙げる11種類があります。
列挙子 | 対象 |
---|---|
ANNOTATION_TYPE | アノテーション宣言 |
CONSTRUCTOR | コンストラクタ宣言 |
FIELD | フィールド宣言 |
LOCAL_VARIABLE | ローカル宣言 |
METHOD | メソッド宣言 |
MODULE | モジュール宣言 |
PACKAGE | パッケージ宣言 |
TYPE | クラス、インタフェース、Enum宣言 |
TYPE_PARAMETER | 型パラメータ宣言 |
TYPE_USE | 型の使用 |
PARAMETER | メソッドの引数宣言 |
なお、@Target
アノテーションで、アノテーションを付与する先を指定しなかった場合は、ElementTypeの列挙子にある箇所であれば、どこでもアノテーションの対象になります。
最後に
メタ・アノテーションは、アノテーションを定義する際にその動作や適用範囲を制御するための重要な機能です。
@Retention
、@Target
、@Documented
、@Inherited
などのメタ・アノテーションを使用することで、アノテーションの振る舞いを柔軟にカスタマイズすることができます。
これにより、アノテーションの再利用性や拡張性が向上し、コードのメンテナンス性が向上します。