Java中Annotation(註釋)系列學習筆記(1)

【轉】Java中Annotation(註釋)系列學習筆記(1)

  關於Annotation註釋,一年以前,阿堂簡單學習了一下,沒有在項目中去用它。。最近在學習國內的高級J2EE架構師黎活明老師的《EJB3入門精典》一書時,一上手便發現有很多的Annotation的應用,所以想把Annotation好好學習一下,如是就有了阿堂下面的這幾遍學習筆記的產生了.順便說一下,EJB3是屬於JAVA中重量級框架,對於分佈式的處理,它有非常明顯的優勢,這一點是和Spring等輕量級框架是有所區別的,可以說是兩者的側重點不同吧。EJB3開發的項目,在銀行,金融,保險等大型企業中有着極爲廣泛的應用。EJB3的產生,完全顛覆了原來EJB2中的一些繁瑣的處理方式,不能不說是一次技術的偉大革新!
  好,下面咱們言歸正傳,開始學習了!
  從JDK1.5開始,Java中增加了對元數據(MetaData)的支持,也就是Annotation(註釋),這種Annotation與Java程序中的單行註釋和文本註釋是有一定區別,也有一定聯繫的。其實,我們現在說的Annotation是代碼裏的特殊標記,這些標記可以在編譯,類加載,運行時被讀取,並執行相應的處理。通過Annotation,程序開發人員可以在不改變原來邏輯的情況下,在源文件嵌入一些補充的信息。代碼分析工具,開發工具和部署工具可通過這些補充信息進行驗正或者部署。
  Annotation提供了一條爲程序元素設置元素的方法,從某些方面來看,Annotation就象修飾符一樣被使用,可用於修飾包,類,構造器,方法,成員變量,參數,局部變量的聲明,這些信息被存在Annotation的"name=value"對中。
注意
    Annotation是的一個接口,程序可以通過反射來獲取指定程序元素的Annotation對象,然後通過Annotation對象來取得註釋裏的元數據。我們需要注意使用Annotation的地方,有的Annotation指的是java.lang.Annotation接口,有的指的是註釋本身.
  
  Annotation能被用來爲程序元素(類,方法,成員變量)設置元數據。值得指出的是:Annotation不能影響程序代碼的執行,無論增加,刪除Annotation,代碼都始終如一地執行。如果希望讓程序中的Annotation能在運行時起一定的作用,只有通過某種配套的工具對Annotation中的信息進行訪問和處理,訪問和處理Annotation的工具統稱爲APT(Annotation Processing Tool).

一.基本Annotation
  Annotation必須使用工具來處理,工具負責讀取Annotation裏包含的元數據,工具還會根據這些元數據增加額外的功能。在系統學習新的Annotation語法之前,先看一下Java提供的三個基本Annotation的用法:使用Annotation時要在其前面增加@符號,並把該Annotation當成一個修飾符使用,用於修飾它支持的程序元素.

三個基礎的Annotation如下
@Override
@Deprecated
@SuppressWarings

(這三個基本的Annotation都定義在java.lang包下)
下面我們來依次這三個Annotation的用法

(1)限定重寫父類方法 @Override
  @Override就是用來指定方法覆蓋的,它可以強制一個子類必須覆蓋父類的方法。如下程序中使用@Override指定子類Apple的info方法必須重寫父類方法
注意: @Override Annotation只能用於作用於方法,不能用於作用於其它程序元素
程序清單

public class  Fruit
{
 public void info()
 {
  System.out.println("水果的info方法...");
 }
}


class Apple extends Fruit
{
 @Override
 public void info()
 {
  System.out.println("蘋果重寫水果的info方法...");
 }
}

  編譯上面程序,可能絲毫看不出程序中@Override有任何作用。因爲@Override Annotation的作用是告訴編譯器檢查這個方法,並從父類查找是否包含一個被該方法重寫的方法,否則就編譯出錯。這個Annotation主要是幫助我們避免一些低級錯務,例如我們把上面的Apple類中的info方法不小心寫成inf0()方法,這樣的“低級錯務”,可能導致後期排錯時的巨大障礙。

例如,我們把Apple中的info方法誤寫成inf0(),編譯程序時將出現如下錯務提示:



(2)標記已過時 @Deprecated
@Deprecated 用於表示某個程序元素(類,方法等)已過時,當其它程序使用已過進的類,方法時,編譯器將會出現警告。如下程序指定Apple類中的info方法已過時,其它程序中使用Apple類的info方法時編譯器將會出給出警告。

如下程序所示

 


class Apple
{
 //定義info方法已過時
 @Deprecated
 public void info()
 {
  System.out.println("Apple的info方法");
 }
}
public class DeprecatedTest
{
 public static void main(String[] args)
 {
  //下面使用info方法時將會被編譯器警告
  new Apple().info();
 } 
}


運行效果圖如下



(3)@SuppressWarnings 抑制編譯器警告
  @SupressWarnings指示被Annotation標識的程序元素(以及在程序元素中的所有子元素)取消顯示指定的編譯器警告。 @SuppressWarnings會一直作用於該程序元素的所有子元素,例如使用@SuppressWarning標識一個類來取消某個編譯器警告,同時又標識該類裏某個方法取消另一個編譯器警告,那麼將在此方法中同時取消這兩個編譯器警告。

  通常情況下,如果程序中使用沒有泛型限制的集合將會引起編譯器警告,爲了避免這種編譯器警告,可以使用@SuppressWarnings Annotation,下面程序取消了沒有使用泛型的編譯器警告。

程序如下所示
@SuppressWarnings(value="unchecked")
public class SuppressWarningsTest
{
 public static void main(String[] args)
 {
  List<String> myList = new ArrayList();  
 } 
}

 

說明:
  程序中使用@SuppressWarnings來關閉SuppressWarningTest類裏的所有編譯器警告,編譯上面程序時將不會看到任保編譯器警告。



如果刪除程序中粗體字代碼,將會看下面圖2中的警告提示



說明:
  當我們使用@SuppressWarnings Annotation來關閉編譯器警告時,一定要在插號裏使用name=value對來爲該Annotation的成員變量設置值.

 

 

轉自:http://blog.sina.com.cn/heyitang

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