「アノテーション」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Hishidama (会話 | 投稿記録)
m編集の要約なし
m編集の要約なし
3行目: 3行目:
元々の意味は、標本などを閲覧した際に、その標本に対するコメントなどを付すことを指す。そのような情報が書かれたものを、アノテーションカードと呼ぶ。
元々の意味は、標本などを閲覧した際に、その標本に対するコメントなどを付すことを指す。そのような情報が書かれたものを、アノテーションカードと呼ぶ。


== Javaにおける'''アノテーション''' ==
== Javaにおけるアノテーション ==
[[Java (プログラミング言語)|Java]]では、[[Java Platform, Standard Edition|Java SE]] 5 から登場した機能に'''アノテーション'''という名前の機能がある。Javaの'''アノテーション'''は、[[クラス]]や[[メソッド]]、[[パッケージ]]に対して[[メタデータ]]として注釈を記入する。Javaの'''アノテーション'''は実態は{{Javadoc:SE|java/lang|java.lang.Annotation}}インタフェースを[[継承]]した[[インタフェース (情報技術)|インタフェース]](<code>interface</code>)であり、自作することもできる。
[[Java (プログラミング言語)|Java]]では、[[Java Platform, Standard Edition|Java SE]] 5 から登場した機能に'''アノテーション'''という名前の機能がある。Javaの'''アノテーション'''は、[[クラス]]や[[メソッド]]、[[パッケージ]]に対して[[メタデータ]]として注釈を記入する。Javaの'''アノテーション'''は実態は{{Javadoc:SE|java/lang|java.lang.Annotation}}インタフェースを[[継承]]した[[インタフェース (情報技術)|インタフェース]](<code>interface</code>)であり、自作することもできる。


82行目: 82行目:
}
}


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


94行目: 94行目:


このとき、{{Javadoc:SE|name=@Retention|java/lang/annotation|Retention}}は、新たにアノテーションNewAnnotationを作るとき、このアノテーション情報はソースコードのみにしか保存されないことを意味する。{{Javadoc:SE|name=@Target|java/lang/annotation|Target}}はこのアノテーションをどの型に使うことができるかを指定している。この場合、ANNOTATION_TYPEとMETHODを指定しているのでこのアノテーションはアノテーション型とメソッドにしか使うことができない。つまり、このNewAnnotationもまた、メソッドだけでなくアノテーションにも保存できるため、メタアノテーションとしても使えることを示している。
このとき、{{Javadoc:SE|name=@Retention|java/lang/annotation|Retention}}は、新たにアノテーションNewAnnotationを作るとき、このアノテーション情報はソースコードのみにしか保存されないことを意味する。{{Javadoc:SE|name=@Target|java/lang/annotation|Target}}はこのアノテーションをどの型に使うことができるかを指定している。この場合、ANNOTATION_TYPEとMETHODを指定しているのでこのアノテーションはアノテーション型とメソッドにしか使うことができない。つまり、このNewAnnotationもまた、メソッドだけでなくアノテーションにも保存できるため、メタアノテーションとしても使えることを示している。
==== {{Javadoc:SE|name=@Retention|java/lang/annotation|Retention}} ====
=== {{Javadoc:SE|name=@Retention|java/lang/annotation|Retention}} ===
メタアノテーション{{Javadoc:SE|name=@Retention|java/lang/annotation|Retention}}には以下の{{Javadoc:SE|java/lang/annotation|RetentionPolicy}}[[列挙型]]を設定することができる。
メタアノテーション{{Javadoc:SE|name=@Retention|java/lang/annotation|Retention}}には以下の{{Javadoc:SE|java/lang/annotation|RetentionPolicy}}[[列挙型]]を設定することができる。
{|class="wikitable"
{|class="wikitable"
111行目: 111行目:
|}
|}


==== {{Javadoc:SE|name=@Target|java/lang/annotation|Target}} ====
=== {{Javadoc:SE|name=@Target|java/lang/annotation|Target}} ===
メタアノテーション{{Javadoc:SE|name=@Retention|java/lang/annotation|Target}}には以下の{{Javadoc:SE|java/lang/annotation|ElementType}}[[列挙型]]を設定することができる。これは配列を使って@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})と複数指定することができる。ただし、同じ値を{}内で複数使用するとエラーとなる。これによって型を指定することで、そのアノテーションが、どの型に対して使うことができるのかを指定できる。
メタアノテーション{{Javadoc:SE|name=@Retention|java/lang/annotation|Target}}には以下の{{Javadoc:SE|java/lang/annotation|ElementType}}[[列挙型]]を設定することができる。これは配列を使って@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})と複数指定することができる。ただし、同じ値を{}内で複数使用するとエラーとなる。これによって型を指定することで、そのアノテーションが、どの型に対して使うことができるのかを指定できる。
{|class="wikitable"
{|class="wikitable"

2007年11月23日 (金) 08:08時点における版

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

元々の意味は、標本などを閲覧した際に、その標本に対するコメントなどを付すことを指す。そのような情報が書かれたものを、アノテーションカードと呼ぶ。

Javaにおけるアノテーション

Javaでは、Java SE 5 から登場した機能にアノテーションという名前の機能がある。Javaのアノテーションは、クラスメソッドパッケージに対してメタデータとして注釈を記入する。Javaのアノテーションは実態はjava.lang.Annotationインタフェースを継承したインタフェース(interface)であり、自作することもできる。

Javaのアノテーションは三つに分けることができる。

  • マーカー・アノテーション – データが無く名前だけを持つアノテーション。
  • 単一値アノテーション – データを一つだけ持つアノテーション。見かけはメソッド呼び出しに似ている。
  • フル・アノテーション – 複数のデータを持つアノテーション。

Java標準APIの主なアノテーション

JUnit4 から利用可能になったアノテーション

  • @Test – そのメソッドがテストメソッドであることを示す。このメソッドにテストを記述する。従来のJUnitでメソッド名がtestで始まるメソッドと同じ。
  • @Before – このアノテーションが付加されたメソッドは、@Testアノテーションが付いたメソッドを実行するたびに事前に実行されることを意味する。JUnit4以前のsetup()メソッドと同じ。
  • @After – このアノテーションが付加されたメソッドは、@Testアノテーションが付いたメソッドを実行するたびに、必ず後から実行されることを意味する。JUnit4以前のtearDown()メソッドと同じ。
  • @BeforeClass – このアノテーションが付加されたメソッドは、そのテストクラスを呼び出す前に実行される。
  • @AfterClass – このアノテーションが付加されたメソッドは、そのテストクラスを呼び出した後に実行される。

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

マーカーアノテーション

クラスやメソッドにマーカーアノテーションを付加するには以下のようクラスやメソッドの接頭辞に最低一つ以上のスペースまたは改行コードを入れて修飾子のように記述する。 この例は、クラスに非推奨、メソッドに、スーパークラスからのメソッドをオーバーライドしていることを意味するマーカーアノテーションを付加している例である。

@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が設定されていない警告と、コレクション総称型による型チェックを行われていないことによって生ずる警告を無視することができる。 "unckecked"はメソッドに対してのみ設定することもできる。

@SuppressWarnings("serial", "unckecked")
class NoSerialVersionIDClass implements java.io.Serializable{
  public void setupList(){
    List list = new ArrayList();
    list.add("abcdef");
  }
}

このアノテーションは正確に記述すると以下のようにString[]配列の初期化宣言のようになる。

@SuppressWarnings(value = {"serial", "unckecked"})

フルアノテーション

フルアノテーションは、複数のデータ型を持つアノテーションである。ここでは自作したアノテーション@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

メタアノテーション@Retentionには以下のRetentionPolicy列挙型を設定することができる。

RetentionPolicy名 説明
RetentionPolicy.CLASS アノテーション情報はコンパイル時に保存されるが実行時にはVMによって保持されない。
RetentionPolicy.RUNTIME アノテーション情報はコンパイル時に保存され、実行時にもVMによって保持される。
RetentionPolicy.SOURCE アノテーション情報はコンパイル時に破棄される。ソースコード内のみで有効。

@Target

メタアノテーション@Retentionには以下のElementType列挙型を設定することができる。これは配列を使って@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})と複数指定することができる。ただし、同じ値を{}内で複数使用するとエラーとなる。これによって型を指定することで、そのアノテーションが、どの型に対して使うことができるのかを指定できる。

ElementType名 説明
ElementType.ANNOTATION_TYPE アノテーション型に指定できることを示す。
ElementType.CONSTRUCTOR コンストラクタに指定できることを示す。
ElementType.LOCAL_VARIABLE ローカル変数に指定できることを示す。
ElementType.FIELD フィールドに指定できることを示す。
ElementType.METHOD メソッドに指定できることを示す。
ElementType.PACKAGE パッケージに指定できることを示す。
ElementType.PARAMATER メソッド引数に指定できることを示す。
ElementType.TYPE クラス、またはインタフェース(アノテーション型を含む)、enum型に指定できることを示す。

関連項目