JAVA 註解-學習篇(1)

JAVA註解

Annotation(註解)是JDK1.5及之後版本引入的。字面上看是解釋的意思,可是沒有那麼簡單。java

註解能夠用在這三個方面:spring

  1. 生成文檔。這是最多見的,也是java 最先提供的註解。經常使用的有@see、@param、@return等,不過如今用的到比較少了。框架

  2. 跟蹤代碼依賴性,實現替代配置文件功能。比較常見的是spring 2.5 開始的基於註解配置。做用就是減小配置,如今的框架基本都使用了這種配置來減小配置文件的數量,這個是咱們主要須要瞭解學習的,由於如今大部分框架都是使用這個的。好比spring中的@Controller等。ide

  3. 在編譯時進行格式檢查。如@Override 放在方法前,若是你這個方法並非覆蓋了超類方法,則編譯時就能檢查出。函數

java.lang.annotation.*下,包含全部JDK中的註解,java.lang.annotation.Annotation 是全部註解繼承的接口,而且是自動繼承,不須要定義時指定,相似於全部類都自動繼承Object。工具

元註解

在java.lang.annotation下定義了四個元註解;學習

1.@Retention:註解的註解,元註解之一,code

做用:定義註解的保留策略繼承

用法:Retention註解有一個屬性value,是RetentionPolicy類型的,Enum RetentionPolicy是一個枚舉類型, 這個枚舉決定了Retention註解應該如何去保持,也可理解爲Rentention 搭配 RententionPolicy使用。 RetentionPolicy有3個值:CLASS,RUNTIME,SOURCE接口

  • 用@Retention(RetentionPolicy.CLASS)修飾的註解,表示註解的信息被保留在class文件(字節碼文件)中當程序編譯時,但不會被虛擬機讀取在運行的時候;
  • 用@Retention(RetentionPolicy.SOURCE )修飾的註解,表示註解的信息會被編譯器拋棄,不會留在class文件中,註解的信息只會留在源文件中;
  • 用@Retention(RetentionPolicy.RUNTIME )修飾的註解,表示註解的信息被保留在class文件(字節碼文件)中當程序編譯時,會被虛擬機保留在運行時,

因此咱們自定義註解時,通常使用@Retention(RetentionPolicy.RUNTIME )。可讓你從JVM中讀取Annotation註解的信息,以便在分析程序的時候使用。

2.@Target:也是用來修飾註解的元註解,

做用:定義註解的做用目標

用法:它有一個屬性ElementType也是枚舉類型,值爲:ANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE,可使用 @Target({ElementType.TYPE,ElementType.FIELD})定義多個做用目標。

  • @Target(ElementType.TYPE) // 接口、類、枚舉、註解
  • @Target(ElementType.FIELD) // 字段、枚舉的常量
  • @Target(ElementType.METHOD) // 方法
  • @Target(ElementType.PARAMETER) // 方法參數
  • @Target(ElementType.CONSTRUCTOR) // 構造函數
  • @Target(ElementType.LOCAL_VARIABLE) // 局部變量
  • @Target(ElementType.ANNOTATION_TYPE) // 註解
  • @Target(ElementType.PACKAGE) / // 包

3.@Documented:說明該註解將被包含在javadoc中,無屬性值。

4.@Inherited:說明子類能夠繼承父類中的該註解,無屬性值。

Annotation的工做原理

JDK5.0中提供了註解的功能,容許開發者定義和使用本身的註解類型。該功能由一個定義註解類型的語法和描述一個註解聲明的語法,讀取註解的API,一個使用註解修飾的class文件和一個註解處理工具組成。

Annotation並不直接影響代碼的語義,可是他能夠被看作是程序的工具或者類庫。它會反過來對正在運行的程序語義有所影響。

Annotation能夠衝源文件、class文件或者在運行時經過反射機制多種方式被讀取。

常見註解

1.@Override註解:

package java.lang
import java.lang.annotation.*
                
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}

這個註解是在子類繼承父類是,要重寫父類的方法的一個標記。若是方法利用此註釋類型進行註解但沒有重寫超類方法,則編譯器會生成一條錯誤消息。

由源碼能夠看出,只做用與方法中,一樣註解不會被class編譯,只會保留在源碼中。

@Override是一個Marker annotation(類體裏面沒有成員),用於標識的Annotation,Annotation名稱自己表示了要給工具程序的信息。

2.@Deprecated註解:

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

指示應該在註釋元素(以及包含在該註釋元素中的全部程序元素)中取消顯示指定的編譯器警告,表示不鼓勵開發人員使用該註解標誌的東西。

注意:在給定元素中取消顯示的警告集是全部包含元素中取消顯示的警告的超集。例如,若是註釋一個類來取消顯示某個警告,同時註釋一個方法來取消顯示另外一個警告,那麼將在此方法中同時取消顯示這兩個警告。

相關文章
相關標籤/搜索