Open Java Project

          Keep it simple, Stupid, Less is more

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            20 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

          1、自定義Annotation類型

          1)定義Annotation類型

          l         使用@interface聲明Annotation類型

          public @interface InProgress {
           
          }

          l         使用Annotation類型

          public class TestAnnotation {
                 @InProcess
                 public void test() {
                   
                 }
          }

          l         如果Annotation類型和使用它的類不在相同的包中,可以import Annotation類型,以便直接使用 @InProgress

          2)添加成員

          l         Annotation類型可以有成員變量,以提供有用的信息

          l         定義數(shù)據(jù)成員不需要定義gettersetter方法,只需要定義一個(gè)以成員名稱命名的方法,并指定返回類型為需要的數(shù)據(jù)類型

          l         簡(jiǎn)單的例子:

          public @interface TODO {
                 String value();
          }

          l         使用帶成員的Annotation類型:

          public class TestAnnotation {
                 @InProcess
                 @TODO("Need to finish this method later")
                 public void test() {
                   
                 }
          }

          3)設(shè)置缺省值

          l         要為Annotation類型的成員設(shè)置缺省值,需要在聲明成員時(shí)使用default關(guān)鍵字:

          public @interface GroupTODO {
                 public enum Severity {
                        CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION
                 };
           
                 Severity severity() default Severity.IMPORTANT;
                 String item();
                 String assignedTo();
                 String dateAssigned();
          }

          l         當(dāng)然,缺省值的類型必須與成員變量聲明的類型完全相同

          l         下面是使用缺省值的例子:

          public class TestAnnotation {
                 @InProcess
                 @GroupTODO(
                        item="Need to finish this method later",
                        assignedTo="nelson_tu",
                        dateAssigned="2005/02/05"
                 )
                 public void test() {
                   
                 }
          }

          l         下面是改寫缺省值的例子:

          public class TestAnnotation {
                 @InProcess
                 //@TODO("Need to finish this method later")
                 @GroupTODO(
                        severity=GroupTODO.Severity.DOCUMENTATION,
                        item="Need to finish this method later",
                        assignedTo="nelson_tu",
                        dateAssigned="2005/02/05"
                 )
                 public void test() {
                   
                 }
          }

           

          2、元Annotation

          l         Annotation就是AnnotationAnnotationJDK5提供了4種預(yù)定義的元Annotation

          1@Target

          l         @Target指定Annotation類型可以應(yīng)用的程序元素,以便在其它程序元素中誤用Annotation類型

          l         程序元素的類型由java.lang.annotation.ElementType枚舉類定義:

          package java.lang.annotation;
           
          public enum ElementType {
            TYPE,          // Class, interface, or enum (but not annotation)
            FIELD,         // Field (including enumerated values)
            METHOD,        // Method (does not include constructors)
            PARAMETER,             // Method parameter
            CONSTRUCTOR,           // Constructor
            LOCAL_VARIABLE, // Local variable or catch clause
            ANNOTATION_TYPE,       // Annotation Types (meta-annotations)
            PACKAGE        // Java package
          }

          l         下面是使用@Target的例子:

          @Target({ElementType.TYPE,
              ElementType.METHOD,
              ElementType.CONSTRUCTOR,
              ElementType.ANNOTATION_TYPE})
          public @interface TODO {
                 String value();
          }

          2@Retention

          l         @Retention Java 編譯器處理Annotation類型的方式有關(guān)

          l         這些方式由java.lang.annotation.RetentionPolicy 枚舉類定義:

          package java.lang.annotation;
           
          public enum RetentionPolicy {
            SOURCE,       // Annotation is discarded by the compiler
            CLASS,       // Annotation is stored in the class file, but ignored by the VM
            RUNTIME       // Annotation is stored in the class file and read by the VM
          }

          l         使用@Retention的例子參看后面的@Documented

          3@Documented

          l         @Documented指明需要在Javadoc中包含Annotation(缺省是不包含的)

          l         下面是一個(gè)使用@Documented的例子:

          @Documented
          @Retention(RetentionPolicy.RUNTIME)
          public @interface InProcess {
           
          }

          l         使用@Documented的一個(gè)技巧就是指定保持性策略為RetentionPolicy.RUNTIME:這樣,Annotation就會(huì)保留在編譯后的類文件中并且由虛擬機(jī)加載,然后Javadoc就可以抽取出Annotation,添加到類的HTML文檔中

          4@Inherited

          l         @Inherited最復(fù)雜、使用最少、也最容易造成混淆的一個(gè)

          l         假設(shè)使用@InProgress 標(biāo)記一個(gè)正在開(kāi)發(fā)的類,只要正確應(yīng)用@DocumentedAnnotation信息就會(huì)出現(xiàn)在Javadoc中;現(xiàn)在要編寫一個(gè)新類,擴(kuò)展那個(gè)正在開(kāi)發(fā)的類,那么使用子類,或者查看它的文檔,根本沒(méi)法表明還有什么地方?jīng)]有完成;而本來(lái)是希望@InProgress Annotation信息會(huì)被帶到子類中,這就需要使用@Inherited

          l         下面是這樣的例子:

          @Documented
          @Inherited
          @Retention(RetentionPolicy.RUNTIME)
          public @interface InProcess {
           
          }
          posted on 2005-03-21 22:02 nelson_tu 閱讀(1126) 評(píng)論(0)  編輯  收藏 所屬分類: Tiger系列
          主站蜘蛛池模板: 永城市| 龙井市| 湟源县| 东乌| 沙坪坝区| 金湖县| 瑞昌市| 德惠市| 泰顺县| 萝北县| 邓州市| 清徐县| 临汾市| 琼海市| 濮阳市| 大同县| 曲阜市| 芜湖市| 砚山县| 娄底市| 南开区| 鄢陵县| 名山县| 广宗县| 江永县| 乌什县| 兴和县| 遂昌县| 徐闻县| 隆子县| 谢通门县| 阿克苏市| 新安县| 荆门市| 凭祥市| 申扎县| 台江县| 宁夏| 水富县| 琼中| 南华县|