Java1.5以降のアノテーションについて知りたい
Java1.5からの新機能【アノテーション】について資料をまとめて欲しいと依頼がありました。普段、Java使用していると@Deprecatedや、@SuppressWarnings、@Overrideなどは使用する機会がありますが、Seasar2系のJava開発を行っているともっと沢山のアノテーションに触れる機会があります。決められたアノテーションを付与する使い方は、今までも沢山してきましたが、アノテーションを自作したり、付与されているアノテーションを元に処理を行うようなことはありませんでした。
アノテーションには、
の3種類があるらしいです。単純に値をとらないか、1つだけ取るか、2つ以上取るかの違いだと思っています。ただ、なんとなくアノテーションを利用していましたので、上のような名前や分類分けがあるなんてことは殆ど意識してませんでした。より意識するようになったのは、私の場合Seasar2などを利用するにようになってからです。
以下の例は、フルアノテーションの自作例です。
package net.bowbow.annotation; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface SampleAnnotation { String value(); int id(); }
以下は、自作したアノテーションの利用例です。
package net.bowbow.base; import net.bowbow.annotation.SampleAnnotation; public class SampleAnno { @SampleAnnotation(value = "Test", id = 1) public String hoge() { return "hoge"; } public int retIntVal() { return 100; } }
そして、以下はそのアノテーションを元に処理を行うサンプルです。
package net.bowbow.base; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import net.bowbow.annotation.SampleAnnotation; public class AnnotationTest { public static void main(String[] args) { SampleAnno myAnno = new SampleAnno(); Method[] ms = myAnno.getClass().getDeclaredMethods(); System.out.println("メソッド数:" + ms.length); for (Method a : ms) { System.out.println("------------------"); if (a.isAnnotationPresent(SampleAnnotation.class)) { System.out.println("指定のアノテーションあり : " + a.getName()); for (Annotation anno : a.getAnnotations()) { System.out.println("アノテーション:" + anno); SampleAnnotation s = (SampleAnnotation) anno; System.out.println("値:" + s.value()); } } else { System.out.println("指定のアノテーションなし : " + a.getName()); } System.out.println(""); } } }
出力は、以下の通りになります。
メソッド数:2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
指定のアノテーションあり : hoge
アノテーション:@net.bowbow.annotation.SampleAnnotation(value=Test, id=1)
値:Test
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
指定のアノテーションなし : retIntVal自分で自作して検証してみると、なるほどいくつかの利用シーンが思い当たるのですが、「これって何にでも適用してよいようなものでもないのでは?」という感想です。
という視点でWEBを探していたら、InfoQさんのサイトでアノテーションハンマー(http://www.infoq.com/jp/articles/Annotation-Hammer)という記事を見つけました。
やっぱり、というか、当然なんでしょうが、使うべき場合と使うべきでない場合があるとのことですが。
個人的にはエレガントな使用シーンというのがなかなかイメージできていません。積極的に使用すれば分かるようになるのでしょうか。
Seasar2のようなある程度の規模のフレームワークでも手掛けないと、必要にならないような気がしてます。。。