"Annotation"は「注釈」の意味を持つ英語です。Javaでは、J2SE 5.0 (Tiger)から登場した新しい技術のことを指します。
Annotationという技術は、Java Community Process (JCP)で"JSR175"という管理番号のもとに議論されてきました。
Annotationは、EoDのための基本となる技術です。
さっそく、例をご紹介しましょう。
class Moge { public void doIt() { ...... } } class Hoge extends Moge { @Override public void doIt() { ...... } }
このプログラムの"@Override"の部分がAnnotationです。
まず、Annotationは"@"からはじまります。そして、@Overrideは、mogeメソッドに対するAnnotationです。その名のとおり、MogeクラスのdoItメソッドをオーバライドしていることを示しています。
では、もうひとつ例をご紹介しましょう。
class Hoge { @Deprecated public void doIt() { ...... } }
この例では、doItメソッドに"@Deprecated"というAnnotationがついています。これは、doItメソッドが「使用を推奨しない」メソッドであることを示しています。
これら2つの例はいずれも、Annotationを使わなければJavadoc形式のコメントに記述する内容ですね。
では、3つめの例です。
@Copyright(value="tomoharu") public class Hoge { ...... }
Copyrightは、Hogeクラスに対するAnnotationです。Annotationには「メンバ」を加えることができます。valueがメンバ名、tomoharuがメンバ値です。ここではメンバはひとつだけですが、複数のメンバを含めることもできます。
Annotationは、クラス・メソッド・フィールド・引数などに付けることができます。Annotationを使うことによって、クラスやメソッドなどにさまざまな情報を付加することができるようになります。
次に、EJBでの例を見てみましょう。
EJB 3.0では、Entity Beanの開発にAnnotationを使用できます。
EJB 2.1までは、EJBの開発には次のようなプログラムや設定ファイルの作成が必要でした。
EJB 3.0では、POJO/POJIにAnnotationを加えることで、開発すべきプログラムや設定ファイルを減らすことができます。
Entity Beanのサンプルをご紹介しましょう。
// Entity Bean である @Entity // EMP テーブルと関連づけられる @Table(name = "EMP") public class Employee implements java.io.Serializable { // empNoプロパティはEntity BeanのIDである // テーブル中では主キーとなる @Id // empNo プロパティは、テーブル中の // EMPNO項目とマッピングしている @Column(name="EMPNO") public int getEmpNo() {return empNo; } ...... }
このEntity Beanでは、テーブル名、主キー、項目名といったリレーショナルデータベースのテーブル中の情報が、Annotationに記述されています。旧来のEntity Beanでは、こうした情報は設定ファイルに記述されていました。
もともと、オブジェクト指向であるJavaプログラムと、リレーショナルデータベースのテーブルとでは情報の管理方法が違うため、テーブルの持つすべての情報をJavaプログラムに持たせることは不可能でした。そのため、設定ファイルが必要になるのです。このことは「インピーダンス・ミスマッチ」と呼ばれています。
しかし、テーブルの持つ情報をAnnotationにしてJavaプログラムに加えることで、Javaプログラムはテーブルの持つ情報をそのまま持つことができるようになります。インピーダンス・ミスマッチが解消されます。
これまでJava EEで提供されている各技術を使ってプログラムを作成するのは、なかなか大変な作業でした。
Annotationを使うことで、次のような効果が出てきます。
こうしたことを積み重ねることにより、プログラム開発がどんどん楽になってきます。
本章の最初に「Annotationは、EoDのための基本となる技術です。」と言いましたが、これらがその理由です。
Annotationは単独では意味を持ちません。Annotationを読み取って処理をするプログラムがあってはじめて役に立ちます(ほとんどの場合、あらかじめ用意されていますが)。
まず、実行されているプログラムからAnnotationを扱うことができます。この場合、Reflection APIを用いて、Annotationを読み取ります。
もちろん、ソースコードからAnnotationを扱うこともできます。この場合は、J2SE標準のapt (Annotation Processor Tool)というツールを使うのが普通です。プログラマは「ファクトリ」と「プロセッサ」を作成してAnnotationを読み取ります。