Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          注釋功能Annotation

          Posted on 2009-12-20 00:32 啥都寫點 閱讀(214) 評論(0)  編輯  收藏 所屬分類: J2SE
             Java有兩個常用的內置的注釋:
                      @Override放在方法的訪問修飾符前,表示該方法覆蓋了父類的同名同參方法,如果該方法沒有覆蓋父類的方法而使用該注釋,則編譯器會報錯。
                      @Deprecated放在變量和方法的訪問修飾符前,表示該變量或者方法已經不推薦使用,通常是因為它很危險或者是存在更好的選擇。
             可以自定義注釋類型,與enum定義枚舉類型一樣,使用@interface定義注釋類型。
             能在自定義的注釋類型中定義其他類、屬性和方法。定義屬性時,以屬性名為方法名,以屬性類型為方法的返回值類型,方法后接default關鍵字表示屬性的默認值。如"String name();"表示該注釋類型具有name屬性,類型為String;而"int age()default 20;"表示該注釋類型具有age屬性,類型為int,默認值為20
             可以在自定義注釋類型的聲明中添加注釋,即注釋的元注釋。Java有2個常用的內置的元注釋。
                      @Target指定Annotation類型可以應用的程序元素, 程序元素的類型由java.lang.annotation.ElementType枚舉類定義。如ElementType.METHOD表示該注釋類型只能用于方法聲明中。
                      @Retention和Java編譯器處理Annotation類型的方式有關,這些方式有java.lang.annotation.RetentionPolicy枚舉類定義。如RetentionPolicy.RUNTIME表示該注釋類型將被編譯成class文件。
                      @Documented指明需要在Javadoc中包含注釋類型(默認是不包含的)


          import java.lang.annotation.ElementType;
          import java.lang.annotation.Retention;
          import java.lang.annotation.RetentionPolicy;
          import java.lang.annotation.Target;

          /**
           * 使用注釋Annotation.
           * Java 編程的一個最新趨勢就是使用元數據,元數據可以用于創建文檔,
           * 跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。
           * 許多元數據工具(如Xdoclet)將這些功能添加到核心Java語言中,暫時成為Java編程功能的一部分。
           * Annotation是可以添加到代碼中的修飾符,
           * 可以用于包聲明、類型聲明、構造函數、方法、域變量、參數和變量
           
          */

          public class AnnotationData {
              @Deprecated 
          private String name;
              
          public AnnotationData(String name){
                  
          this.name = name;
              }


              
          // 方法聲明中使用了內置的@Override元數據,表示該方法覆蓋了父類的同名同參數方法
              
          // 如果父類不存在該方法,則編譯不會通過。
              @Override public String toString() {
                  
          return super.toString() + this.name;
              }

              @Override 
          public int hashCode() {
                  
          return toString().hashCode();
              }

              
          /**
               * 方法中使用了內置的@Deprecated元數據,表示該方法已經不被推薦使用了。
               * 
          @return
               
          */

              @Deprecated 
          public String getName(){
                  
          return name;
              }

              
          public String getAnnotationDataName(){
                  
          return this.name;
              }

              
              
          // 下面自定義元數據類型
              
          // 使用@interface聲明Annotation類型
              public @interface MyAnnotation {
                  
          // 在元數據類中可以定義其他類
                  public enum Severity {
                      CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION
                  }
          ;
                  
          // 定義數據成員不需要定義getter和setter方法,
                  
          // 只需要定義一個以成員名稱命名的方法,并指定返回類型為需要的數據類型
                  
          // default關鍵字為Annotation類型的成員設置缺省值
                  Severity severity() default Severity.IMPORTANT;
                  String item();
                  String assignedTo();
                  String dateAssigned();
              }

              
          // 使用自定義Annotation類型,在使用時,
              
          // 如果Annotation類型在其他的包下,需要跟使用類一樣,import它
              @MyAnnotation(
                      severity 
          = MyAnnotation.Severity.CRITICAL, 
                      item 
          = "Must finish this method carefully"
                      assignedTo 
          = "Programmer A"
                      dateAssigned 
          = "2006/09/10")
              
          public void doFunction() {
                  
          // do something
              }

              
          // 下面再定義一個Annotation類型,使用了元數據的元數據
              
          //  @Target指定Annotation類型可以應用的程序元素,
              
          //  程序元素的類型由java.lang.annotation.ElementType枚舉類定義
              
              
          //  @Retention和 Java 編譯器處理Annotation類型的方式有關,
              
          //  這些方式由java.lang.annotation.RetentionPolicy 枚舉類定義
              
          //  @Documented指明需要在Javadoc中包含Annotation(缺省是不包含的)
              
              
          //@Retention(RetentionPolicy.RUNTIME)這個meta-annotation
              
          // 表示了此類型的annotation將編譯成class文件,而且還能被虛擬機讀取。
              
          //而@Target(ElementType.METHOD)表示此類型的annotation只能用于修飾方法聲明
              @Retention(RetentionPolicy.RUNTIME)
              @Target(ElementType.METHOD)
              
          public @interface MyNewAnnotation{
              }

          }



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 铜鼓县| 庄河市| 喜德县| 阿图什市| 民勤县| 洛隆县| 南部县| 曲周县| 沙坪坝区| 都安| 岳阳县| 桑日县| 榆社县| 象州县| 德江县| 普格县| 凯里市| 县级市| 牟定县| 和田县| 深水埗区| 孟州市| 东源县| 无为县| 灌南县| 高阳县| 永川市| 北流市| 通州市| 巫溪县| 灌南县| 天柱县| 连江县| 达日县| 明溪县| 皋兰县| 原平市| 老河口市| 麻江县| 罗城| 武强县|