Javaのアノテーションですが、よく出てくる割には場面場面でよくでてくるんですけど、根本的にはよく理解できていませんでした。
今もあまりわかっていませんが・・・やはり理解するためには自分で作成するのがいいでしょう。
アノテーション自作
サンプルその1
参考リンク
このリンクを参考に、アノテーションを自作してみました。
解説はコメントをみてください。
MethodInfo.java (アノテーション自体が定義されているクラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.samplebatch; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * * @author matsumoto */ //付与したアノテーション情報をいつまで保持するかを指定するアノテーションです。 @Retention(RetentionPolicy.RUNTIME) //フィールドにつけるか、メソッドにつけるかなどの制限をつける @Target(ElementType.METHOD) public @interface MethodInfo { String description(); String author(); String updater(); } |
Test.java ( アノテーションが付加されているクラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.samplebatch; /** * * @author matsumoto */ public class Test { @MethodInfo(description = "メソッド名はsay", author = "Yamda tarou", updater = "Suzuki jirou") public void say() { System.out.println("本日は晴天なり"); } } |
Main.java (付加されたクラスの情報を出力するクラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.samplebatch; import java.lang.reflect.Method; /** * * @author matsumoto */ public class Main { public static void main(String[] args) throws Exception { //Testクラス内に含まれるsayというメソッドをメソッドクラスで取り出す Method method = Test.class.getMethod("say", new Class[]{}); //メソッドのアノテーションを取得 MethodInfo annnotation = (MethodInfo) method.getAnnotation(MethodInfo.class); //アノテーションのパラメーターを出力 System.out.println(annnotation.description()); System.out.println(annnotation.author()); System.out.println(annnotation.updater()); } } |
出力結果
1 2 3 |
メソッド名はsay Yamda tarou Suzuki jirou |
サンプルその2
メソッド名を出力
MethodInfo.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.samplebatch; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * * @author matsumoto */ //付与したアノテーション情報をいつまで保持するかを指定するアノテーションです。 @Retention(RetentionPolicy.RUNTIME) //フィールドにつけるか、メソッドにつけるかなどの制限をつける @Target(ElementType.METHOD) public @interface MethodInfo { } |
Test.java
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Test { @MethodInfo public void say() { System.out.print("hoge"); } @MethodInfo public void show() { System.out.print("foo"); } } |
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.samplebatch; import java.lang.annotation.Annotation; import java.lang.reflect.Method; /** * * @author matsumoto */ public class Main { public static void main(String[] args) throws Exception { //Testクラス内に含まれる全メソッドを取り出す Method[] methodArr = Test.class.getMethods(); //↑は下記のような書き方でもあり //Class clazz = Test.class; //Method[] methodArr = clazz.getMethods(); for(Method method :methodArr){ //メソッド内のアノテーションをすべて出力する Annotation[] annotationArr = method.getDeclaredAnnotations(); for(Annotation annotation: annotationArr){ //アノテーションのタイプが「MethodInfo.class」と一緒だったら if( annotation.annotationType().equals(MethodInfo.class)){ System.out.println(method.getName()); } } } } } |
出力結果
1 2 |
say show |
参考リンク
ちなみに辞書的な解説は下記が一番わかりやすいです。(最初に読むと頭がパンクするので、サンプルをいくつか書いて理解してからのほうがよいでしょう。)
JavaSE5でのアノテーションの使い方
*SE7でも使えます。