【JavaGold勉強記#18】メタ・アノテーション編

JavaGold資格取得に向けた勉強記第18回は「メタ・アノテーション」についてです。

ここではJavaGold資格取得に向けて勉強している駆け出しプログラマーの私がアウトプットの意味も込めて、「メタ・アノテーション」について紹介させていただきます。

JavaGold資格取得に向けて勉強されている方や、プログラマー初心者の方にとって参考になれば幸いです!

メタ・アノテーションとは?

Javaのアノテーションは、プログラムにメタデータを提供し、特定の振る舞いを制御するための強力な機能です。

前回の記事で独自アノテーションの作成方法についてもまとめていますので一緒にご覧になってください!

https://nichijoplus.com/%e3%80%90javagold%e5%8b%89%e5%bc%b7%e8%a8%9817%e3%80%91%e7%8b%ac%e8%87%aa%e3%81%ae%e3%82%a2%e3%83%8e%e3%83%86%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e4%bd%9c%e6%88%90%e6%96%b9%e6%b3%95%e7%b7%a8/

メタ・アノテーションは、アノテーションを定義するためのアノテーションです。つまり、通常のアノテーションがコードにメタデータを提供するのに対し、メタ・アノテーションはアノテーションそのものに対する情報を与えます

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 などのメタ・アノテーションを使用することで、アノテーションの振る舞いを柔軟にカスタマイズすることができます。

これにより、アノテーションの再利用性や拡張性が向上し、コードのメンテナンス性が向上します。