Java:註解Annotation(中繼資料)

來源:互聯網
上載者:User

標籤:警告   padding   run   runtime   cto   映射關係   應用   web   好的   

本文內容:

  • 註解Annotation的介紹
  • 基本註解的用法

 

首發日期:2018-07-28

註解Annotation的介紹

  • Annotation是代碼中的特殊標記,能夠在編譯、類載入、運行時被識別(需要設定),並根據不同的Annotation來執行不同的處理。
  • Annotation可以修飾包、類、構造器、函數、成員變數、局部變數的聲明、參數等程式元素。Annotation協助這些元素來設定中繼資料,程式從中繼資料中擷取資訊來處理這些元素。

 

 

中繼資料可以描述代碼間關係或者代碼與其它資源的關係,比如說在web.xml中需要將請求路徑跟處理請求的servlet對應起來,比如說在Hibernate中需要.hbm檔案來描述實體類與資料表之間的映射關係。中繼資料可以提供某些資訊來協助我們程式的運行。

在Java中,Annotation就可以幫我們在代碼層面上去設定中繼資料,而不必需要去使用一些例如web.xml的檔案來描述。

 

基本註解的用法

 

 

 

如何使用註解修飾元素:
  • 通常來說,在修飾目標的上一行進行註解,比如。修飾成員變數也是如此。

 

常用的基本的Annotation:

@Override :指明下面修飾的函數必須是重寫父類的函數的函數,如果修飾的函數不在父類中存在,那麼會報錯。

@Deprecated :標明函數、類等元素已淘汰,效果是在使用已經過時的元素時會警告。

@SuppressWarnings:抑制修飾的元素髮生警告(warning),效果是修飾過後,編譯器不會提示警告。

@SafeVarargs【Java7新增】:如果把一個沒有定義泛型的集合,賦給一個有定義泛型的集合,會發生堆汙染,會報錯。@SafeVarargs可以抑制這個報錯。

@FunctionalInterface【Java8新增】:用來限制修飾的介面必須是一個函數式介面,不然會報錯。

 

 

元Annotaion:修飾註解的註解
  • @Retention:指定Annotation的保留方式,保留方式不同,會影響能被使用的位置。比如如果需要通過反射擷取資訊,那麼應該允許運行時還能擷取。
    • @Retention(RetentionPolicy.CLASS):預設值,代表把註解留在class檔案中,程式運行後,JVM將無法擷取註解。【由於裡面的成員變數名為value,所以可以省去 參數名="xxx",如果不是value,那麼不可以省去!】
    • @Retention(RetentionPolicy.RUNTIME):代表把註解留在class檔案中,程式運行後,JVM可以通過反射來擷取註解。
    • @Retention(RetentionPolicy.SOURCE):只留在原始碼中,JVM不會擷取到註解。
  • @Target:限制Annotaion能修飾哪些元素
    • @Target(ElemenetType.ANNOTATION_TYPE):指定被修飾的Annotaion只能用來修飾Annotaion
    • @Target(ElemenetType.FIELD):指定被修飾的Annotaion只能用來修飾成員變數
    • @Target(ElemenetType.CONSTRUCTOR):指定被修飾的Annotaion只能用來修飾構造器
    • @Target(ElemenetType.METHOD):指定被修飾的Annotaion只能用來修飾函數
    • @Target(ElemenetType.LOCAL_VARIABLE):指定被修飾的Annotaion只能用來修飾局部變數
    • @Target(ElemenetType.PACKAGE):指定被修飾的Annotaion只能用來修飾包
    • @Target(ElemenetType.PARAMETER):指定被修飾的Annotaion只能用來修飾參數
    • @Target(ElemenetType.TYPE):指定被修飾的Annotaion只能用來修飾類、介面(包括註解類型)或枚舉定義
  • @Documented:指定Annotaion是否能包含到javadoc產生的文檔中。
  • @Inherited:指定Annotaion具有繼承性,父類定義了這個註解,那麼子類也會繼承這個註解。

 

 

 

自訂註解

 

 

  • 自訂註解跟定義介面差不多,在interface的基礎上加一個@

  • 當就是這麼空,不寫東西的時候,是一個標記型的註解,標記型的註解功能比較簡單,通常只能用來標記特殊的元素從而進行處理。比如Override就是一個標記型的註解。

 

  • 註解可以定義成員變數,這些成員變數以聲明無形參函數的形式存在,傳回值是變數的類型,函數名是變數的名字。註解上定義的成員變數只能是String、數組、Class、枚舉類、註解。成員變數可以提供更多的中繼資料資訊。

定義了成員變數後,在使用的時候需要給成員變數賦值(成員變數名為value時,可以省去value="xxx",但是這個名字時,不可以省略)。在沒有成員變數時,可以單寫註解名,要賦值時就要用上括弧。

  • 如果某些成員變數不需要每次都賦值,可以給它設定預設值。成員變數可以有預設值,在變數的後面加上default 預設值.

 

 

 

註解處理器:

對於Java內建的註解,Java有自己的註解處理器去處理。但自訂的註解,需要自己去定義註解處理器,自己去調用註解處理器去處理。所以,註解處理器本質上也是一個普通函數,不過它的工作主要是處理註解罷了。

在學會怎麼定義註解處理器之前先瞭解幾個前置知識:

  • 所有註解的父介面都是Annotation。
  • 一個註解,只有它的存在時間足夠我們才能使用它,所以如果我們想使用註解處理器,註解首先需要使用@Retention(RetentionPolicy.RUNTIME)修飾。
  • java.lang.reflect包中存在一些能夠實現反射功能的工具類。
  • java.lang.reflect包中有一個AnnotationElement介面,它聲明了一系列可以擷取註解的函數,並且它有幾個實作類別,如下所見,所以你可以在類、建構函式等對象中調用聲明好的函數來擷取註解。。
    • getAnnotation(註解.class):擷取對應類型的註解
    • getAnnotations():擷取所有註解
    • getDeclaredAnnotations():擷取直接註解,忽略繼承過來的註解。
    • isAnnotationPresent(註解.class):判斷對應類型的註解是否存在

 

 

擷取註解:

....其他對象就示範了。

 

操作註解:通常來說,都是處理註解帶上的資訊。

 

 

小例子

不知道你有沒有瞭解過org.junit.Test這個東西,這個可以讓你直接運行你想要啟動並執行函數(可以稱為單元測試?)。而不需要你建立一個main()去調用。

下面做一個樣本,來實作類別似的功能:

1.建立註解:

2.使用註解:

 

3.調用註解處理器:【這裡使用了org.junit.Test來調用,你也可以在main()中調用!】

 

結果是:

 

補充:
  • 上面的小例子中並沒有使用註解的成員變數,但事實上,使用成員變數也同樣只是擷取裡面的資訊來做更多處理罷了,這就依靠個人去應用了。

 

 

Java:註解Annotation(中繼資料)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.