アノテーション

アノテーション（英語：annotation）とは、あるデータに対して関連する情報（メタデータ）を注釈として付与すること。XML等の記述形式を用いてメタデータをタグ付けする場合が多い。付与したメタデータやタグを指してアノテーションという場合もある。

マーカーアノテーション

クラスやメソッドにマーカーアノテーションを付加するには以下のようクラスやメソッドの接頭辞に最低一つ以上のスペースまたは改行コードを入れて修飾子のように記述する。
この例は、クラスに非推奨、メソッドに、スーパークラスからのメソッドをオーバーライドしていることを意味するマーカーアノテーションを付加している例である。
@Deprecated class DeprecatedClass {
    @Override public boolean equals(Object obj) {
        return this == obj;
    }}

単一値アノテーション

単一値アノテーションを付加するには以下のようにする。
この例は、Serializableインタフェースを実装したクラスのフィールドにstatic finalなserialVersionUIDが宣言されていないという警告を無視するアノテーションを付加していることを意味する。
@SuppressWarnings(value = {"serial"})class NoSerialVersionIDClass implements java.io.Serializable { }
これは、以下のような書き方もできる。これは単一値アノテーション@SuppressWarningsがvalue()メソッドを一つしか持たないことがわかっているためvalue = を省略できることを意味する。
@SuppressWarnings("serial")class NoSerialVersionIDClass implements java.io.Serializable { }
このアノテーションは、戻り値の型がString[]になっているため同じvalue値であっても以下のように複数指定することができる。以下のように指定することで、シリアルバージョンIDが設定されていない警告と、コレクションで総称型による型チェックを行われていないことによって生ずる警告を無視することができる。 "unchecked"はメソッドに対してのみ設定することもできる。
@SuppressWarnings("serial", "unchecked")class NoSerialVersionIDClass implements java.io.Serializable {
    public void setupList() {
        List list = new ArrayList();
        list.add("abcdef");
    }}
このアノテーションは正確に記述すると以下のようにString[]配列の初期化宣言のようになる。
@SuppressWarnings(value = {"serial", "unchecked"})

フルアノテーション

フルアノテーションは、複数のデータ型を持つアノテーションである。ここでは自作したアノテーション@MyAnnotationがあるとき、以下のように、変数名 = 値の形をカンマで区切って記述する。各値の記法は、各アノテーションで定義されているメソッドの戻り値の型で決まる。たとえばこの場合valueという変数名はStringを戻り型にとるvalue()というメソッドと、intを戻り型にとるversion()というメソッドを持つ。フルアノテーションの場合は、defaultによりデフォルト値が設定されているアノテーション以外は、value = やversion = を省略することはできない。
@MyAnnotation(value = "abc", version = 2)class AnnotatedClass { }

アノテーションを定義する

アノテーションを定義するには、interfaceキーワードの接頭辞に@をつけて定義する。

マーカーアノテーション

マーカーアノテーションは以下のように定義する。メソッドやフィールドが一切ないマーカーインタフェースのアノテーション版ともいえる。@Overrideや@Deprecatedがこれらのアノテーションに相当する。
public @interface MarkerAnnotation { }

単一値アノテーション

単一値アノテーションは以下のように定義する。このアノテーションには少なくともメソッドがひとつだけ定義されている。単一値アノテーションのメソッド名にはvalueという名前をつけるのが儀礼である。
@interface Single {
    String value();}

フルアノテーション

フルアノテーションは以下のように定義する。以下のように二つ以上のメソッドを定義する。
@interface FullAnnotation {
    String value();
    int id();}

メタアノテーション

メタアノテーションとは、定義しているアノテーションのみにつけられるアノテーションのことである。メタアノテーションの例としては@Targetや@Retention、@Documented、@Inheritedがあり、これらはクラスやメソッドなどには使うことができず、アノテーションのみに使うことができる。アノテーションを定義するために使われるアノテーションということから、メタアノテーションと呼ばれる。

メタアノテーションを使用する

メタアノテーションを使ってアノテーションを定義するには、以下のように記述する。
@Retention(RetentionPolicy.SOURCE)@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})public @interface NewAnnotation {}
このとき、@Retentionは、新たにアノテーションNewAnnotationを作るとき、このアノテーション情報はソースコードのみにしか保存されないことを意味する。@Targetはこのアノテーションをどの型に使うことができるかを指定している。この場合、ANNOTATION_TYPEとMETHODを指定しているのでこのアノテーションはアノテーション型とメソッドにしか使うことができない。つまり、このNewAnnotationもまた、メソッドだけでなくアノテーションにも保存できるため、メタアノテーションとしても使えることを示している。

Visual C++のSAL注釈

Microsoft Visual C++は、SAL注釈 (SAL annotation) と呼ばれる独自のソースコード注釈言語をサポートする。SAL注釈は関数の引数や戻り値、構造体やクラスのメンバー変数（フィールド）といったC言語/C++の構文要素を修飾し、振る舞いや仕様を規定することで、これらを利用するコード上の誤りをコンパイラによって指摘することができるようになる。また、SAL注釈によって仕様が明確になり、公開されたヘッダーファイルそのものがAPIドキュメントとして利用できるようになる。Visual C++がサポートするコード分析機能（/analyze）はSAL注釈に対応しており、通常のコンパイラ警告よりも詳細なヒントやアドバイスを出力することができる。