1. 程式人生 > >JAVA 註解機制

JAVA 註解機制

不知道大家在平時用到註解的頻率多不多,註解對我們的幫助很大,能為我們節省很多工作。最直接的就是可以代替配置檔案的功能,無論是基本的servlet還是常用的三大框架,裡面都使用了註解,並且逐漸的代替了原本繁瑣的配置,大大提高了編碼效率。 
  隨著註解使用的越來越頻繁,我們對底層實現的瞭解越來越少,所以在這一章我們來好好了解一下註解是怎麼實現的。 
  首先註解是什麼?通俗的意思是為程式的元素(類、方法、成員變數)加上更直觀更明瞭的說明(比如 @Override),這些說明資訊是與程式的業務邏輯無關,並且是供指定的工具或框架使用的。 
  他的基本原理和流程就是:通過呼叫Java的反射機制相關API來訪問annotation資訊。首先載入使用註解的類,得到class類。然後再得到類相應的方法,成員變數。得到變數後呼叫相應的類、方法、成員變數的物件的isAnnotationPresent方法判斷是否使用了註解。之後通過呼叫相應的類、方法、成員變數的的getAnnotation方法得到相應的註解的物件。接下來我們就可以操作註解物件完成相應的邏輯。 
  我們來熟悉一下註解的基本結構: 
這裡寫圖片描述

 
  最上面的一部分註解叫做元註解,就是註解的註解。@Target 指的是這個註解可以用在什麼地方。他的引數可以有如下: 
這裡寫圖片描述 
  接著就是@Retention了,它指的是這個註解的生命週期。他的引數可以包括SOURCE、CLAS和 RUNTIME。

  • SOURCE:如果Retention成員取值為SOURCE,表明該註解只存在原始碼當中,在編譯的時候會被編譯器丟掉。如重寫方法時,方法上面會有@Override註解,這個註解就是source型別的。

  • CLASS:表示註解會被存到位元組碼檔案.class中,但是虛擬機器載入class檔案的時候不會將註解匯入,因此執行時無法得到。如果不在註解中使用Retention指定,則預設的保留策略為CLASS。

  • RUNTIME:不僅儲存到class檔案,還會被虛擬機器載入記憶體,因此在執行的時候可以通過反射得到並且使用這些註解。我們待會的例子就是以RUNTIME為例。
  • 而 @Inherited和@Documented表達的意思比較簡單:@Inherited 
    表示子類可以繼承父類的註解(有空會細講);@Documented 表示生成doc文件的時候會包含這個註解。
  • “public @interface Anno”則是定義註解的關鍵字以及名字。接下來就是一些成員變量了,注意:這裡是變數,不要以為有個括號就是方法了。使用方式是這樣的@Anno(name=”wizard”,age=12) 。 
      注意:成員變數只能是基本型別、String、class、enum、Annotation和以上型別的陣列,而且必須是無引數、不能丟擲異常。