1. 程式人生 > >Java Annotation原理分析(一)

Java Annotation原理分析(一)

小引: 在當下的Java語言層面上,Annotation已經被應用到了語言的各個方面,它已經在現在的ssh開發中,通過Annotation極大的提高了開發的效率,堪稱開發神器。在這篇文章中,我們來了解一下的Annotation在Java中的前身今世吧。

1.   Java Annotation因何而來?

      最初從印象中,是可以替代之前JDK1.4開發中,大量繁瑣的配置項,Annotation的出現其實可以極大簡化配置檔案的數量和需要關注配置的內容。在閱讀了諸多文章之後,發掘,這個取代配置項只是一個附帶的結果,或者是我們開發者從中受益最多的方面罷了。其實,它背後的原因遠不是如此。

     我們還是引用Wiki百科的觀點來綜述原因吧,a form of syntactic metadaa that can be added to Java source code,就是說,Annotation的引入是為了從Java語言層面上,為Java原始碼提供元資料的支援[

參考資料1]。

     那第二個問題就來了,何為metadata(元資料)呢 ?

     Wiki官方的解釋是Metadata is "data about data" [參考資料2],精闢呀,用來描述資料本身的資料。如果我們把Java的原始碼看做是資料的話,那麼metadata就是為了描述這些原始碼而產生和使用的元資料,Annotation就是在Java語言層面上實現了metadata機制。

     Metadata分為兩個方面的內容:   structural metadata和descriptive metadata,簡而言之,就是結構性的元資料和描述性的元資料兩種,當然這裡的兩種劃分是否準確有待商榷,但是卻讓大致明白了它所應用的場景和場合。

    那是否有童鞋依然對Metadata一頭霧水呢? 下面我們來舉幾個小例子,幫助大家感知一下元資料吧。

     比如我們從網上搜索一部電影的資訊,電影本身是一個數據,可以播放和觀看娛樂消遣。但我們如何才能找到我們想要的電影呢?想一想,對了,我們可以按照主演、導演、上映時間、影片型別、觀眾評分、票房收入和發行公司等諸多的資訊進行搜尋。這些我們搜尋的條件,就是我們這裡所謂的關於電影本身的metadata,他們都是用來描述電影本身的資料,但是不影響電影本身的播放和觀看的。[參考資料3]

2.   Java Annotation的歷史簡述

    在引入Annotation之前,Java中其實已經有了類似的東西,比如transient和@deprecated。在2004年正式被JCP接受,在JDK5中正式引入的,主要是通過開發包中的apt命令來進行處理。 在JDK6中,將其整合到javac, 允許使用者自定義Annotation,為使用者自行擴充套件開啟了通道。

3.   Annotation在Java中的應用

     Annotation在Java可以像public, final等語法修飾一樣使用, 用以修飾用於包、類 型、構造方法、方法、成員變數、引數、本地變數的宣告中。另外對於允許自定義引數的Annotation還可以在宣告中使用引數。

     在Java中主要用在以下幾個方面:

  •      文件編制
                   通過@Documented來標註是否需要在javadoc中出現。
  •      編譯器檢查

                   通過Annotation的使用,可以調整和控制編譯器的使用以及讓編譯器提供關於程式碼的更多的檢查和驗證,比如@Override,@SuppressWarning.

  •     程式碼分析

                  這個是我們開發者從中受益良多的部分,通過Annotation的使用,可以讓我們在程式碼執行中動態得去控制系統的行為,從而省去之前諸多的配置和冗餘程式碼。這個會

                  在後續的例項中加以詳述。 這裡有一點需要說明的是,Annotation不影響已有程式碼的執行,但是會影響系統在執行中的行為,這兩個在不同的層面上,一個是已有的

                  程式碼執行層,另外一個是JVM會根據Annotation的指令修改系統行為的。

4.  Annotation在Java中的使用方法

      下面我們來直接看一個Annotation的例子,感受一下它的威力吧。

public class AnnotationOverrideTest {
     @Override public String toString() { /////---  可以當做修飾符一樣直接使用,非常熟悉吧
         return "Override the toString() of the superclass";
     }

    @Override  //也可以分為單獨一行
     public String toString123() {  //提示編譯錯誤
         return "Override the toString() of the superclass";
     }

 } 

     大家可以看到@+Annotation的名稱就可以直接使用了,這裡使用了@Override這個Annotation來讓編譯器檢查toSring()這個方法是否覆蓋了基類的方法。如果基類並沒有這個方法的話,則會報錯。 在toString123()這個方法中,就會提示錯誤資訊:

AnnotationOverrideTest.java:7: method does not override or implement a method from a super-type
   @Override public String toString123() {
   ^

    這個@Override可以幫助我們的攻城師儘可能早的發現程式碼中隱藏的問題,如果未使用它的話,可能只有在執行過程中,才會有機會發現這個問題,不是嗎?

(未完待續, 後續提綱如下,歡迎指正)

 5.   Annotation在Java語言中的內建型別介紹

 6.  Annotation的型別分類

 7.  Annotation的原理實現

 8.   如何自定義Annotation

 9.  Annotation在Spring中的應用案例分析

 10.  總結