「註解」這個詞,可謂是在Java程式中出鏡率比較高,而且也是一個老生常談的話題。我們之前在聊Spring相關的東西時,註解是無所不在,之前我們簡單的聊過一些「註解」的相關內容,例如在Spring中是如何進行「註解」組合的。因為註解在Java程式設計中還是比較重要的,所以我們今天的部落格就把註解的東西給系統的介紹一下,當然我們會依託於具體的實例。
「註解」說白了就是儲存資料的一種方式,如果註解單拎出來功能也就一般,如果將「註解」與Java的「反射機制」結合,那麼可以做的事情就變多了。也就是說,你可以透過反射來讀取「註解」提供的訊息,然後來根據你的具體需求來做一些事情。當然,之前我們常用XML來為反射機制提供信息,不過「XML」的配置還是沒有「註解」這種數據形式好管理,好維護,所以「註解」的地位還是比較重要的。
下方我們先聊一下“元註解”,然後在根據這些“元註解”來自定義註解,並使用Java的“反射機制”來讀取各種類型的註解資訊。
一、元註解
#在本部落格的第一部分,我們先來整體的看一下「元註解」,然後下方的內容再根據這些元註解進行展開。
1、@Target
#使用方式:@Target(ElementType .CONSTRUCTOR)
#@Target註解是比較重要的,Target的中文是「目標、位置」的意思,見名知意。 @Target就用來聲明我們所創造的註解所放置的位置,也就是我們所創造的註解可以修飾什麼樣的元素。 @Target的參數是一個ElementType的枚舉,每個枚舉項代表著一個位置。下方就是幾個ElementType枚舉比較常用的值:
TYPE: 類,如果@Target的參數是TYPE,那麼我們創建的這個註解只能修飾類別、介面、枚舉等這些類型上。
FIELD: 字段修飾,如果我們的自訂註解是FIELD類型的話,那麼我們的註解只能用來修飾類別或列舉的字段,也就是成員變數。
CONSTRUCTOR:建構器類型,此類型的「註解」只能修飾建構器。
METHOD:修飾「方法」的註解。
PARAMETER:修飾「方法」中的參數的註解。
LOCAL_VARIABLE: 修飾「局部變數」的註解。
當然,上面是簡單一聊,下方會給出上述類型註解的具體實例。下面截圖是ElementType中所有的選項以及每個枚舉值的作用。具體如下圖所示,下方兩個是1.8後面新增的枚舉項,如下圖:
##
#2、@Retention使用方式:@Retention(RetentionPolicy.
RUN###TIME###) ################## ######上面是###@Retention###的使用方式,Retention的中文意思是「###保留## #”,也就是說該元註解給了「註解」的保留週期。 ###@Retention###也是接收一個列舉型別的參數,下方就是該枚舉所包含的型別。下方的英文###註解###已經具體的給了每個枚舉項所對應的意思。 ###SOURCE:說明我們的註解只會留在我們的原始碼中,並且不會被編譯。
CLASS: 說明我們的註解會被編譯成字節碼儲存到.class檔案中,但不會在虛擬機器中連結運作。
RUNTIME:這表示我們的註解會一直保留到程式的運行時,如果你想在運行時根據註解的資訊透過反射機來做一些事情的話,那麼就必須得將我們的註解保留到這一階段。
#3、@Document與@Inherited
這兩個註解就比較簡單了,@Document說明將此註解包含在Javadoc中,而@Inherited則表示,該註解可以被子類別繼承。
上述的介紹可能會有些抽象,接下來我我們就根據實例,利用反射機制來操作對應類型的自訂註解。
二、測試案例介紹
下方截圖是這篇部落格所涉及Demo的目錄以及主要的操作類別。
AnnotationTracker:該類別負責透過Java的「反射機制」來取得對應類型的註解的物件以及註解中的相關訊息。在AnnotationTracker的類別中,全是靜態方法,靜態方法傳入的是相關註解修飾的Class。大體結構如下圖所示。
CE…Annotation:這些類別是不同類型的註解,稍後我們會詳細討論。
TestClass:該類別是註解所修飾的測試類別。
Main:我們本Demo的測試案例的執行方法。
#
三、型別註解:@Target( ElementType.TYPE)
接下來,我們來看看類型註解的建立與使用。下方內容我們下創建一個修飾類型的註解,然後再相關類別中加入上該註解的修飾,最後使用Java的反射機制來取得對應的註解資訊。
1、建立註解
先建立我們的註解,具體步驟如下所示,選擇Annotation後鍵入註解名點擊回車即可。
下方程式碼片段就是所建立註解中的詳細內容。我們可以看出@Target元註解的參數是ElementType.TYPE類型的。也就是說明我們所創造的這個註解是修飾型別的註解,可以作用域類別、介面、枚舉等類型。然後我們也看到@Retention的參數是RetentionPolicy.RUNTIME類型的,說明該註解一直保留到執行時間。
註解是使用@Interface來宣告的,這與介面的什麼類似。 @Interface後方跟著的是註解的名稱,本註解的名稱為CETypeAnnotation。其中有一個公有的(public)整數(int)類型的id屬性。該屬性的預設值是0,具體如下所示。
2、註解的使用
#下方程式碼段是上述註解的使用。因為上述創建的註解是ElementType.TYPE類型的,所以我們就用該註解來修飾我們所建立的一個類,也就是下方的TestClass。在註記修飾時,我們為id設定了一個值,也就是下方的id = 10。
#3、使用反射取得修飾型別註解的相關資訊
#接下來,我們就要在
AnnotationTracker類別中加入利用Java的「反射機制」來取得對應的TestClass類別的註解的相關資訊了,關鍵程式碼如下所示。 trackTypeAnnotation()方法的參數是一個Class類型,然後可以透過Class的getAnnotation()
方法來取得對應類別中的註解物件。如下方的紅框所示。 取得完對應的註解物件後,我們就可以取得到對應註解中的設定資訊了。
#4、測試案例以及測試結果
接下來我們就在Main方法中來呼叫AnnotationTracker類別中的上述方法,並傳入TestClass,如下所示。下方是其列印結果。
四、其他類型的註解 #上述我們詳細的聊了
ElementType.TYPE類型的註解,接下來我們來看一下其他類型的註解,以及這些註解的使用方式。
1、@Target(ElementType.
CONSTRUCTOR)接下來我們來建立一個修飾構造器的註解。下方的CEConstructorAnnotation就是我們所創建的用來修飾類別建構器的註解。其中的value欄位的預設值是一個空字串。
#2、
@Target(ElementType.
FIELD)#接下來我們就來建立一個修飾欄位的註解,我們將該欄位命名為CEFieldAnnotation,具體程式碼如下所示:
3、
@Target(ElementType.
METHOD)下方是我們創建的修飾方法的註解,我們將其命名為CEMethodAnnotation,具體程式碼如下所示。
#4、
@Target(ElementType.
PARAMETER)#下方是修飾法中參數的註解,我們將其命名為,如下:
#五、上述相關註解的使用
#下方就是上述所定義的各種類型的註解的使用方式,各司其職。具體就不做太多贅述了。六、使用反射機制取得不同類型的註解資訊# ######之前我們已經聊瞭如何使用「Java」的反射機制來獲取相關註解的信息,下方我們將會分別獲取上述各種類型的註解的相關信息。下方代碼主要是AnnotationTracker中的相關代碼。 ############1、取得修飾建構器類型的註解資訊############# ######### ####
2、取得修飾方法與方法參數的註解資訊
#
3、取得修飾欄位的註解資訊
以上是Java反射中的註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!