Java中Annotation的介紹

    Java註釋被用來爲java代碼提供元數據(meta data)。作爲元數據,註釋不會直接影響代碼的執行結果,不過事實上有些註釋就是爲了影響代碼的執行結果而定義的。

      Java註釋是從Java 5開始添加的。本文對於Java註釋的討論是基於java 6的,據我所知,到目前爲止Java 7中關於註釋的部分並沒有發生改變,所以本文對java 7編程人員上來說應該也是可用的。

      目錄:

      · Java 註釋的作用

     · 註釋的基礎知識

     · 註釋的位置

     · Java中預置的註釋

     · 創建你自己的註釋

Java 註釋的作用

     預編譯指令(Compiler instructions)

    編譯時指令(Build-time instructions)

    運行時指令(Runtime instructions)

    Java有三個編譯註釋,你可以使用它們來給編譯器發送指令。這些註釋會在稍後再做更詳細的介紹。

    Java註釋可以在編譯時(build-time)時使用,當你編譯你的工程時。編譯過程包括生成源代碼,編譯資源文件,生成XML文件(如:部署表述文件),以及將編譯好的代碼或文件打包成一個jar文件等。編譯過程通常是由諸如Apache Ant或Apache Maven之類的編譯工具自動完成的。編譯工具會瀏覽你代碼中的特定註釋,並基於這些註釋生成源代碼或其他文件。

    通常情況下,Java註釋在代碼編譯完成後就變得不可見了。但是存在這種可能,你可以定義自己的註釋,並使它們在運行時仍然可見。之後可以通過反射機制來訪問這些註釋來影響你的程序。

註釋的基本知識

    註釋的最簡單形式如下:

[java] view plaincopy
  1. @Entity  
     字符@告訴編譯器這是一個註釋,後面的Entity表示該註釋的名稱。

註釋的元素
     一個註釋可以包含多個可以被賦值的元素。一個元素就像是一個屬性或者參數。下面是一個包含一個元素的註釋

[java] view plaincopy
  1. @Entity(tableName = "vehicles")  
     元素緊跟在註釋之後,並放置在圓括號中,沒有元素的註釋,不需要圓括號。註釋可以包含多個元素,當只包含一個元素時,可以省略元素名,只提供元素值既可,如下:
[java] view plaincopy
  1. @InsertNew("yes")  

註釋的位置

    你可以將註釋放置到類、接口、方法、方法參數、成員變量、局部變量之前。下面是一個將註釋放到類之前的例子:

[java] view plaincopy
  1. @Entity  
  2. public class Vehicle {  
  3. }  
    下面是一個更大的例子,演示了在類、成員變量、方法、參數以及局部變量之前添加註釋。僅作演示之用,並沒有什麼特別的用意。
[java] view plaincopy
  1. @Entity  
  2. public class Vehicle {  
  3.   
  4.     @Persistent  
  5.     protected String vehicleName = null;  
  6.   
  7.   
  8.     @Getter  
  9.     public String getVehicleName() {  
  10.         return this.vehicleName;  
  11.     }  
  12.   
  13.     public void setVehicleName(@Optional vehicleName) {  
  14.         this.vehicleName = vehicleName;  
  15.     }  
  16.   
  17.     public List addVehicleNameToList(List names) {  
  18.   
  19.         @Optional  
  20.         List localNames = names;  
  21.   
  22.         if(localNames == null) {  
  23.             localNames = new ArrayList();  
  24.         }  
  25.         localNames.add(getVehicleName());  
  26.   
  27.         return localNames;  
  28.     }  
  29.   
  30. }  

Java預置的編譯註釋

    Java支持三個可以用來給編譯相關的註釋,它們是:

    · @Deprecated

    · @Override

    · @SuppressWarings

    下面將對它們此次做解釋

@Deprecated

    @Deprecated用來標記一個類、方法、成員變量已經被捨棄了。如果你的代碼中使用捨棄(Deprecated)的類、方法或成員變量,那麼編譯器會給你一個警告。下面是一個例子:

[java] view plaincopy
  1. @Deprecated  
  2. public class MyComponent {  
  3.   
  4. }  
    當你使用@Deprecated表示捨棄時,你也可以在Java文檔中對捨棄的原因加以說明。

@Override

    @Override被用在方法前,用來說明覆蓋了父類中的方法。假如一個方法被@Override修飾,但實際上它並沒有覆蓋任何方法,則編譯器會提示一個錯誤。

    @Override並不是必須的,即覆蓋父類方法時,也可以不在子類方法前面添加@Override。但是還是推薦使用@Override,因爲這樣做是有好處的,至少可以較少一些不必要的錯誤。如覆蓋方法的方法名不對,並沒有實現覆蓋;或者有人修改了父類中的方法名,導致的子類中的覆蓋失效,如果有@Override,編譯器就會自動提示錯誤,從而避免了錯誤。

@SuppressWarnings

    使用@SuppressWarnings能夠是編譯器對指定的方法放棄提示警告。如方法中引用了已經被捨棄(@Deprecated修飾)的方法時。

創建你自己的註釋

    創建自己的註釋是有可能的。註釋被定義在它們自己的文件中,就像Java中的類或接口一樣。下面是一個例子:

[java] view plaincopy
  1. @interface MyAnnotation {  
  2.   
  3.     String   value();  
  4.   
  5.     String   name();  
  6.     int      age();  
  7.     String[] newNames();  
  8.   
  9. }  
     這個例子定義了一個包含四個元素的叫MyAnnotation的註釋。

     注意,每個元素的定義都很像接口中的方法定義。你可以使用原始數據類型定義元素的數據類型,你也可以使用數組定義元素的數據類型。但是不能使用複合對象(Complex Object定義元素的數據類型。

    要使用上面自定義的註釋,可以這樣做:

[java] view plaincopy
  1. @MyAnnotation(  
  2.     value="123",  
  3.     name="Jakob",  
  4.     age=37,  
  5.     newNames={"Jenkov""Peterson"}  
  6. )  
  7. public class MyClass {  
  8.   
  9.   
  10. }  

元素的默認值

    你可以爲一個元素指定默認值(有點像C++中的方法哈)。這樣在註釋初始化時那個元素就可以忽略了。如下定義了一個包含默認值的註釋

[java] view plaincopy
  1. @interface MyAnnotation {  
  2.   
  3.     String   value() default "";  
  4.   
  5.     String   name();  
  6.     int      age();  
  7.     String[] newNames();  
  8.   
  9. }  
    在調用時,可以忽略包含默認值的元素,這裏指的是value元素,如:
[java] view plaincopy
  1. @MyAnnotation(  
  2.     name="Jakob",  
  3.     age=37,  
  4.     newNames={"Jenkov""Peterson"}  
  5. )  
  6. public class MyClass {  
  7.   
  8.   
  9. }  

@Retention

    你可以指定你自定義的註釋在運行時可用,通過反射檢測。要實現這樣的效果,你需要用@Retention修飾你自定義的註釋,如下:

[java] view plaincopy
  1. import java.lang.annotation.Retention;  
  2. import java.lang.annotation.RetentionPolicy;  
  3.   
  4. @Retention(RetentionPolicy.RUNTIME)  
  5.   
  6. @interface MyAnnotation {  
  7.   
  8.     String   value() default "";  
  9.   
  10. }  
    這裏的@Retention(RetentionPolicy.RUNTIME)會告訴編譯器和JVM當前這個註釋是可以在運行時通過反射機制訪問的。

     RetentionPolicy還包含了其他兩個值:

         RetentionPolicy.CLASS:意味着該註釋需要被保存在.class文件中,但是在運行時是不可用的。這是retention默認的值。

         RetentionPolicy.SOURCE:意味着該註釋只在源代碼中可用,而不是在.class文件,也不是在運行時。

@Target
    你可以指定那些Java元素(類、方法等)可以使用你自定義的註釋。可以在定義你的Annotaion添加@Target來實現。如下:

[java] view plaincopy
  1. import java.lang.annotation.ElementType;  
  2. import java.lang.annotation.Target;  
  3.   
  4. @Target({ElementType.METHOD})  
  5. public @interface MyAnnotation {  
  6.   
  7.     String   value();  
  8. }  
    上面的代碼限制了該註釋只能用來註釋方法(而不是類、成員變量之類的)

     ElementType.ANNOTATION_TYPE

     ElementType.CONSTRUCTOR

     ElementType.FIELD

     ElementType.LOCAL_VARIABLE

     ElementType.METHOD

     ElementType.PACKAGE

     ElementType.PARAMETER

    ElementType.TYPE

    上面大多數數值都是可以見文知意的,其中ANNOTATION_TYPE表示只能用來註釋註釋類型(Annotation),就像@Target和@Retention一樣。

@Inherited

    @Inherited表明,一個子類實現了繼承了父類中的註釋,如下:

[java] view plaincopy
  1. java.lang.annotation.Inherited  
  2.   
  3. @Inherited  
  4. public @interface MyAnnotation {  
  5.   
  6. }  

[java] view plaincopy
  1. @MyAnnotation  
  2. public class MySuperClass { ... }  
[java] view plaincopy
  1. public class MySubClass extends MySuperClass { ... }  

    在這個例子中,MySubClass繼承了父類MySuperClass中的@MyAnnotation註釋。

@Documented

    @Documented用來表明你自定義的註釋需要在JavaDoc中可見。如下:

[java] view plaincopy
  1. java.lang.annotation.Documented  
  2.   
  3. @Documented  
  4. public @interface MyAnnotation {  
  5.   
  6. }  
[java] view plaincopy
  1. @MyAnnotation  
  2. public class MySuperClass { ... }  

    當你生成MySupperClass類的JavaDoc文檔時,@MyAnnotation註釋會出現在JavaDoc文檔中。

    這次不是"O啦~~~",而是

    哇偶~~~,終於結束了!!!

    轉帖請保留出處:http://blog.csdn.net/u011638883/article/details/13168799

    謝謝!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章