java 註解 實戰剖析

爲了是大家初步瞭解什麼是註解(Annotation),我們先來看如下代碼:
相關代碼一:
public class AnnotationTest {
public static void main(String[] args) {
    Date nowDate = new Date();
    String strDate = nowDate.toLocaleString();
    System.out.println(strDate);// 2009-12-27 16:44:09
}
}
上述代碼在eclipse編輯器中會出現警告,內容爲"The method toLocaleString() from the type Date is deprecated",它的意思是說toLocaleString()方法是個過時的方法;
爲了更好的理解它的含義,我們在cmd窗口來編譯它,如下


那麼我們可以怎麼把這個警告給去掉呢,這是就要使用到註解,我們在main方法之前加上這樣一句"@SuppressWarnings("deprecation")",也可以用快捷方式加上,那麼警告就會消失。
代碼就變成了這樣:
public class AnnotationTest {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
    Date nowDate = new Date();
    String strDate = nowDate.toLocaleString();
    System.out.println(strDate);// 2009-12-27 16:44:09
}
}

注意:每個註解就是一個類,我們在用註解時,就相當於創建了一個註解類的實例;

2.在寫程序中,我們可能不希望某個方法之後不被再次調用,那麼我們就可以把這個方法定義爲過時的方法,過時的方法在調用時,會在方法名上打上刪除線,告訴程序員該方法爲過時方法,最後不要再用了。下面我們寫一個自定義的過時方法:
相關代碼二:
public class AnnotationTest {

@Deprecated
private static void sayHello() {
    System.out.println("Hello word !");
}
public static void main(String[] args) {
    AnnotationTest.sayHello();
}
}

注意:只需要在方法前加上:@Deprecated,那麼該方法就會被eclipse編輯器打上刪除線,來表明爲過時方法.

3.JDK爲我們提供瞭如下3中基本的註解Annotation:
.Deprecated:用@Deprecated 註釋的程序元素,不鼓勵程序員使用這樣的元素,通常是因爲它很危險或存在更好的選擇。 
.Override:用@Override表示一個方法聲明打算重寫超類中的另一個方法聲明。 
.SuppressWarnings:@SuppressWarnings("deprecation")指示應該在註釋元素(以及包含在該註釋元素中的所有程序元素)中取消顯示指定的編譯器警告。

4.註解相當於一種標記,在程序中加了註解就等於爲程序打上了某種標記,沒加,則等於沒有某種標記,以後,java編譯器,開發工具和其他程序可以用反射來了解你的類及各種元素上有無何種標記,看你有什麼標記,就去幹相應的事,標記可以加在包,類,字段,方法,方法的參數以及局部變量上。它位於java.lang.annotation中。

5.通常應用註解有如下三個步驟:
1).定義註解類,格式爲:public @interface A{
}
2).應用註解類,如:
@A
class B{
}
3).對應用註解類的類進行反射操作(的類),如:
B.class.isAnnotationPresent(A.class);
A a = B.class.isAnnotationPresent(A.class);

6.下面我們來完成上述三步操作:
1).切換到java透視圖上,點擊新建一個註解:
代碼如:
public @interface MyAnnotation {
}
2).創建一個類應用該註解:
@MyAnnotation
public class AnnotationTest {
public static void main(String[] args) {
}
}
3.對應用註解類的類進行反射操作:
public static void main(String[] args) {
    if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
      MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
      System.out.println(myAnnotation);
    }
}
注:這是程序運行沒有輸出,明明有註解,怎麼會沒輸出呢?這時我們在MyAnnotation註解類前面加上:@Retention(RetentionPolicy.RUNTIME),再次運行時,就會輸出"MyAnnotation"

7.下面我們來解釋下什麼叫Retention,Retention本身也是一個註解,叫元註解,它後面跟一個值,這個值表示該註解保留到代碼的那個階段;
@Retention元註解,有三種取值,即有三種生命週期:
RetentionPolicy.SOURCE:對應java源文件
RetentionPolicy.CLASS:對應class文件
RetentionPolicy.RUNTIME:對應內存中的字節碼
默然值就是RetentionPolicy.CLASS,在註解類上加的註解叫“元註解”,class文件本身不是字節碼,只有class文件被類加載器被加載到內存中進行校檢處理之後,纔是二進制的字節碼,他們的生命週期不是不同的。
注:如果我們把6中的RetentionPolicy.RUNTIME,改成其他兩個中任何一個得話,也是無輸出的,因外其他兩個的註解生命週期不是運行期,即在內存中無法找到。

8.如果我們在MyAnnotation註解類前面再加上:@Target(ElementType.METHOD),那麼AnnotationTest類前面就會有錯誤提示:"The annotation @MyAnnotation is disallowed for this location",即@MyAnnotation不能放在這個位置,爲什麼呢?因爲剛纔我們在MyAnnotation註解類前面再加上:@Target(ElementType.METHOD),它表示該註解只能用在方法上面,如果要想讓該註解用的類上面,就可以不剛纔那句修改成"@Target({ElementType.METHOD,ElementType.TYPE})",ElementType.TYPE它表示該註解可以應用的類,接口,枚舉等類型上。

9.註解的高級應用-爲註解增加屬性,我們在剛纔的MyAnnotation註解類增加一個屬性,代碼如下:
代碼:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color();
}
那麼此時,我們就會發現,AnnotationTest類的上面有錯誤提示“The annotation @MyAnnotation must define the attribute color”,即必定義color的屬性,我們此時就可以把類上面的註解修改成:@MyAnnotation(color="red"),OK了!說明註解類有屬性時,在我們調用時就必須提供屬性值,除非註解類中的屬性有默認值,
代碼:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color() default "yellow";
}
調用的時候就可以直接:@MyAnnotation或@MyAnnotation();

再如代碼:
public @interface MyAnnotation {
String color() default "yellow";
String style();
}
調用的時候就可以直接: @MyAnnotation(color="red",style="fashion")或@MyAnnotation(style="fashion");有默認值的時候,默認值可以省略。

但是通常我們有如下用法:
@SuppressWarnings("deprecation"),它怎麼只提供屬性值,而沒有屬性名呢?這就是value()屬性的特殊用法,它可以放回任意類型;

再如代碼:
public @interface MyAnnotation {
String color() default "yellow";
String style() default "fashion";
String value();
}
調用的時候就可以直接: @MyAnnotation(color="red",style="fashion",value="hello")
或@MyAnnotation("hello");

10.爲註解增加高級屬性,如數組,枚舉,註解,具體就不再舉例了,可以參考java語言規範中的實例。

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