程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 如何使用Annotation

如何使用Annotation

編輯:關於JAVA
 配置文件的好處在於進一步降低耦合,使應用更易於擴展,即使對配置文件進行了修改也不需要對工程進行修改和重新編譯。缺點也是顯而易見,配置文件讀取和解析需要花費一定的時間,配置文件過多時難以管理,IDE 無法對配置的正確性進行校驗,給測試增加了難度。基於以上原因,Java 從1.5開始提供了 Annotation (注釋,標注),它用來修飾應用程序的元素(類,方法,屬性,參數,本地變量,包、元數據),編譯器將其與元數據一同存儲在 class 文件中,運行期間通過 Java 的反射來處理對其修飾元素的訪問。Annotation 僅僅用來修飾元素,而不能影響代碼的執行。只有通過其配套的框架或工具才能對其信息進行訪問和處理。這一點與 xml 相同,沒有 struts api 的 struts.XML 文件對程序不會起來任何作用。

  Q:如何使用 Annotation ?
  A:首先讓我們從 Java 定義的 Annotation 開始。@Override 可能是我們最常用到的 Annotation 之一了,Eclipse 中當子類中的某個方法覆寫的父類中的方法時,會亮黃燈提示。若用 @Override 修飾該方法,黃燈熄滅。再讓我們來看一個例子,當我們使用 new Java.util.Date(2010, 2, 25); 來初始化日期類時,Eclipse 仍然會亮黃燈提示,這是因為該方法被 @Deprecated 修飾了,表示不推薦使用。從這兩個例子我們能夠了解到,Annotation 是在編譯期校驗的。這一點最大的好處是在編譯期間就可對錯誤進行處理。若使用 XML 的話,只有在運行期才能得到錯誤信息。

  Q:Java 標准的 Annotation 有哪些?
  A:@Deprecated 相當於Javadoc的@deprecated,被@Deprecated標注的對象class, method等被注明為不推薦使用。主要用於Javac等編譯工具。
    @Override 注明對象method重載了父類的方法。Javac等編譯工具編譯時會根據此Annotation判斷重載方法是否正確。
    @SuppressWarnings 告訴Javac等編譯器忽略所指定的特定的警告信息。
    @Target 被定義的annotation可以附加在那些對象上。
    @Retention annotation的作用期間。
    這裡我們要重點介紹兩個 Annotation ,因為這兩個 Annotation 有一點特殊,因為它們並不是用來修飾代碼,而是用來修飾 Annotation 的。
  @Target 用來標注定義的 Annotation 可以附加在那些對象上。可選參數包括CONSTRUCTOR(構造器)、FIELD(屬性及enum實例)LOCAL_VARIABLE(局部變量)、METHOD(方法)、PACKAGE(包)、PARAMETER(參數)以及TYPE(類、接口、注解類型、enum)。下例定義的 Annotation 被 @Target 修飾,表示該 Annotation 可以用來修飾屬性和參數。

    @Target( { FIELD,  PARAMETER})
    public @interface Resource {
      public String id() default "";
    }

  使用方法:

    public class Mxjava {
      @Resource(id="http://www.mxJava.com")
      private String url;
      public void getLog(@Resource(id="001") String logId) {...}
    }

  @Retention 用標注在什麼級別保存該 Annotation 。可選參數包括SOURCE(編譯期會被忽略不做保存)、CLASS(編譯後的 class 文件中可用,但虛擬機運行時忽略)、RUNTIME(運行期保留,若要使用反射機制讀取 Annotation 信息的話,使用該項。)

    @Target( { FIELD,  PARAMETER})
    @Retention(RUNTIME)
    public @interface Resource {
      public String id() default "";
    }

  Q:如何定義 Annotation ?
  A:先讓我們來看一個最簡單的 Annotation 。

    @Target( { FIELD })
    @Retention(RUNTIME)
    public @interface Resource {
      public String id() default "";
    }

    @Target 是 Java 標准的 Annotation,本例中指定定義的 Annotation 可以附加在屬性(FIEld)上。@Retention 也是 Java 標准的 Annotation,指定作用期間是運行期。@interface 是用來修飾 Annotation 的,請注意,它不是 interface。這個關鍵字聲明隱含了一個信息:它是繼承了 Java.lang.annotation.Annotation 接口,而不是聲明了一個 interface。Annotation 成員的定義看上去很象方法,default “” 表示默認值為空字符串。使用方法如下:

    public class mxjava {
      @Resource(id="http://www.mxJava.com")
      private String url;
    }

    若沒有配套的框架和工具,@Resource 是不起任何作用的。就象前面講到的那樣,它不會對代碼的執行有任何影響。

  Q:什麼時候需要自定義 Annotation ?
  A:一般來說,若不做框架和工具的開發,一般情況下是不需要自定義 Annotation 的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved