Metadata(Java)
Metadata
一般に、「Meta(メタ)」という言葉は、それに続く言葉の上位概念を表します。したがって、Metadataは、dataの上位のdata、つまりdataのdataという意味です。たとえば、dataの属性(attribute)は典型的なMetadataで、ファイル名、テーブル名、フィールド名、保存場所といった「属性名」はこれに当たります。
Java5で導入されたMetadataは、プログラムの要素(クラス、インターフェイス、メソッド、フィールド)に対するもので、注釈(Annotation)といった意味合いの強いものです。したがって、MetadataというよりもAnnotation(アノテーション)と呼ばれることの方が多いと思います。
注釈というと1.4系以前でのJavadocコメントといった形で注釈をつけることができましたが、なぜ、これをJava言語のSyntaxとして取り込んだのでしょうか。
MedataはJSR-175の「A Metadata Facility for the Java (TM) Programming Language」で要求(JSRとは、Java Specification Requestの略です)が起されていますので、このページのRequestの部分を読めばそれが分かります。
ここを読んでみると、EJBやWebServiceに付随する煩雑なプログラミング(特に、EJBについては、これまで批判の対象となってきました)を楽にする、といったような意味合い、また、これらについて、コードGeneratorの利用によるスタブ(中身はないが、形式としては正しいプログラム。スケルトン)生成が目的に入っているようです。
これらのスタブの生成は、XDocletといったツールで既に実現できますし、WebServiceのツールとしては、古くから、現在Apache Webserviceプロジェクトに入っているAxis(2007/3/1時点ではAxis2がSOAP1.2の実装となっています)がスタブ生成ツールを持っていました。
ORマッパーとして著名なHibernateも、XMLでテーブル定義を行い、DDLを生成するといった形式をとっています。
Java5では、こういったトレンドをJavaに取り込んでいこうという現れと解釈することができると思います。
Java5のAnnotationには、Staticな利用方法と、Dynamicな利用方法の2つの利用形態が用意されています。
スタブ生成は、このうちのStaticな利用方法の代表的なものです。
JavaのSyntaxとして、Annotationを取り込んだというのは、この後者にあたる部分をさしていて、reflection APIによってクラス内に定義されたAnnotationへのアクセスが可能になるといった、変更が加えられています。
ここで、個人的な話をしてしまうと、私は元来Annotationが好きではありません。
ですので、このページでも、軽く触れるにとどめておきます。
Annotationのサンプルプログラム
Java5では、以下の6種類のAnnotationが標準で付随しています。Annotation | 意味 |
Deprecated | (将来的になくなるため)非推奨とする、ということを意味する |
Override | スーパークラスのメソッドをオーバーライドしている、と宣言する |
Inherited | サブクラスにもアノテーションを引き継ぐ |
Retension | アノテーションの利用方法(SOURCE、RUNTIME)を規定する |
Target | アノテーションの対象(クラス、メソッドなど)を規定する |
Documented | Javadocでアノテーションを表記するようにする |
このうち、プログラムコードそのものに関係するのは、DeprecatedとOverrideの2種類です。
また、自分でアノテーションを作成することもできます。
以下では、DeprecatedとOverrideについて簡単なサンプルを使って説明します。
この2つは、便利で有用だと思います。
<AnnotationSample.java>
package beans;
public class AnnotationSample{
public String overrided(int i, String _str){
return _str;
}
// (A) 非推奨メソッドの定義
@Deprecated
public void deplicatedMethod(){
System.out.println("This method is deprecated!!");
}
}
上の例では、deplicatedMethod()を非推奨にマークしています。Java5でのアノテーションは、Javadocコメントの中ではなく、コードの中にそのまま@付きで書き込みます。
Eclipseでこのコードを書くと、メソッド名に取り消し線が表示されます。
<SampleMeta1>
package test;
import beans.AnnotationSample;
public class SampleMeta1 extends AnnotationSample{
public static void main(String[] args) {
AnnotationSample _ds = new AnnotationSample();
_ds.deplicatedMethod(); // (a) 非推奨メソッドの利用
}
// (b) 正しくOverrideしている。
@Override
public String overrided(int i, String _str){
return _str;
}
// (c) Overrideしているつもりが、Overloadしている。
@Override
public String overrided(String _str){
return _str;
}
}
上のサンプルは分かりにくいのですが、@Overrideを検証するためにAnnotationSample.javaを継承しています。
(a)では非推奨としてマークされているメソッドの利用、(b)、(c)ではOverrideを試みています。(b)は正しくoverrideしていますが、(c)ではシグナチャを間違えてoverrideするつもりがoverloadになっています。ありがちなミスですね。
このコードは、(c)のためにコンパイルエラーとなります。
Eclipseでこのコードをみると、(a)には取り消し線が入って「警告」表示、(c)ではエラー表示となります。当然、(b)には警告もエラーも表示されません。
2007年03月01日(木) 09:16:01 Modified by wanderingse