出典(authority):フリー百科事典『ウィキペディア(Wikipedia)』「2016/03/06 06:56:30」(JST)
アノテーション(英語:annotation)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること。XML等の記述形式を用いてメタデータをタグ付けする場合が多い。付与したメタデータやタグを指してアノテーションという場合もある。
Javaのアノテーションはクラスやメソッド、パッケージに対してメタデータとして付加情報を記入する機能で、Java SE 5 で追加された。 アノテーションはjava.lang.Annotation
インタフェースを実装することで自作することもできる。
Javaのアノテーションは三つに分けることができる。
@Deprecated
– 対象となるクラスやメソッドが非推奨であることを情報として付加する。Javadocの@deprecatedと同じ。@Override
– そのメソッドがスーパークラスのメソッドをオーバーライドしていることを示す。C#のoverride修飾子とほぼ同等の機能を果たす。@SuppressWarnings
– 引数で指定した特定の警告メッセージをJavaコンパイラに与えず無視する。@Target
– 定義したいアノテーションがどこに適用されるべきかを指し示すメタアノテーション。@Retention
– アノテーションの配置方法を設定するメタアノテーション。test
で始まるメソッドと同じ。setup()
メソッドと同じ。tearDown()
メソッドと同じ。クラスやメソッドにマーカーアノテーションを付加するには以下のようクラスやメソッドの接頭辞に最低一つ以上のスペースまたは改行コードを入れて修飾子のように記述する。 この例は、クラスに非推奨、メソッドに、スーパークラスからのメソッドをオーバーライドしていることを意味するマーカーアノテーションを付加している例である。
@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もまた、メソッドだけでなくアノテーションにも保存できるため、メタアノテーションとしても使えることを示している。
メタアノテーション@Retention
には以下のRetentionPolicy
列挙型を設定することができる。
RetentionPolicy名 | 説明 |
---|---|
RetentionPolicy.CLASS | アノテーション情報はコンパイル時に保存されるが実行時にはVMによって保持されない。 |
RetentionPolicy.RUNTIME | アノテーション情報はコンパイル時に保存され、実行時にもVMによって保持される。 |
RetentionPolicy.SOURCE | アノテーション情報はコンパイル時に破棄される。ソースコード内のみで有効。 |
メタアノテーション@Target
には以下のElementType
列挙型を設定することができる。これは配列を使って@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})と複数指定することができる。ただし、同じ値を{}内で複数使用するとエラーとなる。これによって型を指定することで、そのアノテーションが、どの型に対して使うことができるのかを指定できる。
ElementType名 | 説明 |
---|---|
ElementType.ANNOTATION_TYPE | アノテーション型に指定できることを示す。 |
ElementType.CONSTRUCTOR | コンストラクタに指定できることを示す。 |
ElementType.LOCAL_VARIABLE | ローカル変数に指定できることを示す。 |
ElementType.FIELD | フィールドに指定できることを示す。 |
ElementType.METHOD | メソッドに指定できることを示す。 |
ElementType.PACKAGE | パッケージに指定できることを示す。 |
ElementType.PARAMETER | メソッド引数に指定できることを示す。 |
ElementType.TYPE | クラス、またはインタフェース(アノテーション型を含む)、enum型に指定できることを示す。 |
全文を閲覧するには購読必要です。 To read the full text you will need to subscribe.
リンク元 | 「注解」「annotation」「注釈づけ」 |
.