軟件工程實踐者

          統計

          留言簿

          友情鏈結

          閱讀排行榜

          評論排行榜

          如何編寫子定義annotation及使用JDK5.0 annotation包中的annotations

          這一小節介紹如何編寫一個自定義的注解類型,以及如何應用JDK5.0 java.lang.annotation包中提供的4種注解:
          @Documented,@Retention,@Target,@Inherited

          1. 編寫自定義@Todo注解
          經常我們在寫程序時,有時候有些功能在當前的版本中并不提供,或由于某些其它原因,有些方法沒有完成,而留待以后完成,我們在javadoc中用@TODO來描述這一行為,下面用java注解來實現。

          public @interface Todo { } // Todo.java

          如果你想讓這個注解類型能夠自省的話,給它加上@Todo注解,寫法如下:

          @Todo
          public @interface Todo{ }


          下面我們給這個注解接受參數的能力,代碼如下:
          @Todo("Just articleware")
          public @interface Todo{
            public enum Priority { LOW, MEDIUM, HIGH }
            String value();
            String[] owners() default "";
            Priority priority() default Priority.MEDIUM;
          }

          注意注解類性所能接受的參數類型有著嚴格的規則:
          a. 參數類型只能是:primitive, String, Class, enum, annotation, 或者是數組;
          b. 參數值不能為空,因此每一個參數值都要定義一個缺省值;
          c. 名字為value的參數可以用簡便的方法來設置;
          d. 參數的寫法如同寫簡單方法(看如上代碼),不允許加入參數,不允許有throws子句等。

          在上面的代碼中,我們為@Todo定義了3個參數, 分別是value, owners, priority. 注意:由于value的特殊性,它的的卻省值可以由上面代碼中的"Just articleware"來定義,當然你也可以單獨寫一個缺省值。

          下面看一個應用@Todo注解的例子:
          @Todo(
            value="Class scope",
            priority=Unfinished.Priority.LOW
          )
          public class TodoDemo {
          
            @Todo("Constructor scope")//通過快捷方式,設置value的值
            public TodoDemo() { }
          
            @Todo(owner="Jason", value="Method scope")
            public void foo() { }
          }

          上面的代碼很簡單,不多介紹。

          下面我們想讓@Todo不能應用在fields, parameters, 或者local variables(因為這對我們來說沒有意義);它應當可以出現在javadoc中;在運行是具有持久性。要實現這些特性,就需要annotation包的支持啦。

          2. 應用annotation包的支持

          1)@Documented
          類和方法的annotation缺省情況下是不出現在javadoc中的,為了加入這個性質我們用@Documented
          應用代碼如下(簡單,不多介紹):
          package com.robin;
          import java.lang.annotation.*;
          
          @Todo("Just articleware")
          @Documented
          public @interface Todo{ ...
          


          2)@Retention
          用來表明你的annotation的有效期,可以有三種選擇(如圖所示):

          以下示例代碼應用RUNTIME策略
          package com.robin;
          import java.lang.annotation.*;
          
          @Todo("Just articleware")
          @Documented
          @Retention(RetentionPolicy.RUNTIME)
          public @interface Todo{ ...

          3) @Target
          @Target注解表明某個注解應用在哪些目標上,可選擇如下范圍:
          • ElementType.TYPE (class, interface, enum)
          • ElementType.FIELD (instance variable)
          • ElementType.METHOD ElementType.PARAMETER
          • ElementType.CONSTRUCTOR
          • ElementType.LOCAL_VARIABLE
          • ElementType.ANNOTATION_TYPE (應用于另一個注解上)
          • ElementType.PACKAGE

          按我們的功能要求,代碼如下:
          package com.robin;
          import java.lang.annotation.*;
          
          @Todo("Just articleware")
          @Documented
          @Retention(RetentionPolicy.RUNTIME)
          @Target({ElementType.TYPE,ElementType.METHOD,
           ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
           ElementType.PACKAGE})
          public @interface Todo{ ...

          4) @Inherited
          @Inherited表明是否一個使用某個annotation的父類可以讓此annotation應用于子類。
          示例代碼如下:
          package com.robin;
          import java.lang.annotation.*;
          
          @Todo("Just articleware")
          @Documented
          @Retention(RetentionPolicy.RUNTIME)
          @Target({ElementType.TYPE,ElementType.METHOD,
           ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
           ElementType.PACKAGE})
          @Inherited
          public @interface Todo{
            public enum Priority { LOW, MEDIUM, HIGH }
          
            String value();
            String[] owners() default "";
            Priority priority() default Priority.MEDIUM;
          }

          posted on 2006-01-02 10:31 軟件工程實踐者 閱讀(1220) 評論(0)  編輯  收藏 所屬分類: Java Domain

          主站蜘蛛池模板: 宁都县| 商丘市| 满城县| 福建省| 玉环县| 宝兴县| 远安县| 志丹县| 清新县| 铁岭市| 夏津县| 格尔木市| 阜平县| 靖安县| 五莲县| 东安县| 万山特区| 辰溪县| 新邵县| 龙州县| 梁山县| 呼和浩特市| 宁海县| 卢湾区| 黄浦区| 彰武县| 富民县| 依安县| 蓝田县| 绍兴市| 邻水| 朝阳市| 潞西市| 光泽县| 威远县| 泾源县| 彰化市| 肥城市| 麻城市| 师宗县| 西充县|