J2SE 1.5 (Tiger) download から J2SE 1.5 をダウンロードしてインストールしよう。主要な変更点を試すのに忘れてはいけないのは、javac コマンドでコンパイルするときに -source 1.5 を追加することだけだ。
Nutshellで紹介されている次の内容についてみてみよう。
・Metadata
Metadata
注意 … 完全に理解しているわけではないので間違いがあるかもしれません。勘違いなどありましたら、ご指摘いただければと思います。
Metadataは普通のユーザーはあまり定義しないだろうが、開発ツールなどが利用することになるだろう。たとえば、XDocletなどはコメントの中に記述した特殊なタグを利用して1つのファイルから必要なファイルを生成する。これらのコメント内の特殊なタグは、クラスやメソッドなどと強く結びついたものなのだが、言語仕様ではサポートしていなかったため、仕方なくコメントの中に組みこんでいたのだ。こういった特殊なタグを言語仕様でサポートするためにMetadataが導入されたと考えて良いだろう。
せっかく言語仕様でこういったことを導入するので、いろいろ検討されたのだろう。面白い機能が多い。Annotationというだけあって、単なるコメントとは違う機能を実現できる。java.lang.annotation.RetentionPolicy.SOURCEを指定すれば、ソースコード上でのヒントとして利用できるがコンパイル時にそのヒントは削除される。しかし、java.lang.annotation.RetentionPolicy.RUNTIMEを指定すれば実行時にそのAnnotationを取りだして利用することが出来る。しかもヒント情報を保持するために特別なinterfaceを使うこともできるのだ。Nutshellでは、Annotationの宣言方法と、メソッドにつけられているヒント情報をとりだす方法が紹介されている。そちらも見ながら次のプログラムを参考にしてもらいたい。
ここでは、実行時に利用可能なdebug, info というメタインタフェースと、開発時に利用可能なtodoというメタインタフェースを用意してみた。MetadataTestのメソッド testMethod1, testMethod2 に Annotation を記述している。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.*;
@Retention(RetentionPolicy.RUNTIME) @interface debug {
boolean isDebugMode() default false;
int priority();
}
@Retention(RetentionPolicy.RUNTIME) @interface info {
String info() default “”;
}
@Retention(RetentionPolicy.SOURCE) @interface todo {
String memo() default “Todo”;
}
public class MetadataTest {
final boolean debugMode=true;
@debug(isDebugMode=debugMode,priority=2)
public void testMethod1() {
}
@debug(isDebugMode=debugMode,priority=1)
@info(info=”something”)
@todo(memo=”priority 1″)
public void testMethod2() {
}
public static void main(String[] args) {
MetadataTest mt = new MetadataTest();
try {
Annotation[] a = mt.getClass().
getMethod(“testMethod1”).getAnnotations();
for (Annotation i : a) {
System.out.println(“testMethod1 anotations: “+i);
}
a = mt.getClass().getMethod(“testMethod2”).getAnnotations();
for (Annotation i : a) {
System.out.println(“testMethod2 anotations: “+i);
}
} catch(NoSuchMethodException e) {
System.out.println(e);
}
}
}
実行結果は次のようになる。実行時に取りだされるものと、取りだされないものがあることがわかるだろう。todoのようなものはソースコード編集時に必要なだけなので、実行時に取りだせる必要はない。実行時にdebugのprioriyの値によって処理の分岐をさせたりすることができると、統合環境のデバッグモードのきめ細かなコントロールができるようになりそうだ。infoは複数のAnnotationを関連づけることができることの確認のためにつけただけなので、ここではそれ以外に特別な意味はない。
$ java MetadataTest
testMethod1 anotations: @debug(isDebugMode=true, priority=2)
testMethod2 anotations: @debug(isDebugMode=true, priority=1)
testMethod2 anotations: @info(info=something)
開発ツールを提供するプログラマにとっては魅力的な機能だが、通常のプログラマにとってはどんな活用法があるのか、というのはちょっとみえにくい。しかし、Metadataをうまく利用してあげると、開発効率をあげることができるのではないかというのは想像できる。興味深い機能だ。
ピンバック: りょ!