1. 程式人生 > >Java中的註解的詳解

Java中的註解的詳解

oca 目的 它的 解包 log 重寫 XML variable ted

詳解Java中的註解

Java中,註解(Annotation)引入始於Java5,用來描述Java代碼的元信息,通常情況下註解不會直接影響代碼的執行,盡管有些註解可以用來做到影響代碼執行。

註解可以做什麽

Java中的註解通常扮演以下角色:

  1. 編譯器指令
  2. 構建時指令
  3. 運行時指令

l Java內置了三種編譯器指令,本文後面部分會重點介紹

l Java註解可以應用在構建時,即當你構建你的項目時。構建過程包括生成源碼,編譯源碼,生成xml文件,打包編譯的源碼和文件到JAR包等。軟件的構建通常使用諸如Apache AntMaven這種工具自動完成。這些構建工具會依照特定的註解掃描Java

代碼,然後根據這些註解生成源碼或文件。

l 通常情況下,註解並不會出現在編譯後的代碼中,但是如果想要出現也是可以的。Java支持運行時的註解,使用Java的反射我們可以訪問到這些註解,運行時的註解的目的通常是提供給程序和第三方API一些指令

註解基礎

一個簡單的Java註解類似與@Entity。其中@的意思是告訴編譯器這是一個註解。而Entity則是註解的名字。通常在文件中,寫法如下

public @interface Entity { }

註解元素

Java註解可以使用元素來進行設置一些值,註解中的元素類似於屬性或者參數。定義包含元素的註解示例代碼

public @interface Entity {

String tableName();

}

使用包含元素的註解示例代碼

@Entity(tableName = "vehicles")

上述註解的元素名稱為tableName,設置的值為vehicles。沒有元素的註解不需要使用括號。

如果註解包含多個元素,使用方法如下

@Entity(tableName = "vehicles", primaryKey = "id")

如果註解只有一個元素,通常我們的寫法是這樣的

@InsertNew(value = "yes")

但是這種情況下,當且僅當元素名為value,我們也可以簡寫,即不需要填寫元素名

value,效果如下

@InsertNew("yes")

註解使用

註解可以用來修飾代碼中的這些元素

接口

方法

方法參數

屬性

局部變量

一個完整的使用示例如下:

內置的Java註解

Java中有三種內置註解,這些註解用來為編譯器提供指令。它們是

@Deprecated

@Override

@SuppressWarnings

1.@Deprecated

· 可以用來標記類,方法,屬性。

· 如果上述三種元素不再使用,使用@Deprecated註解

· 如果代碼使用了@Deprecated註解的類,方法或屬性,編譯器會進行警告

@Deprecated使用很簡單,如下為註解一個棄用的類。

@Override

@Override註解用來修飾對父類進行重寫的方法。如果一個並非重寫父類的方法使用這個註解,編譯器將提示錯誤。

實際上在子類中重寫父類或接口的方法,@Overide並不是必須的。但是還是建議使用這個註解,在某些情況下,假設你修改了父類的方法的名字,那麽之前重寫的子類方法將不再屬於重寫,如果沒有@Overide,你將不會察覺到這個子類的方法。有了這個註解修飾,編譯器則會提示你這些信息。

@SuppressWarnings

@SuppressWarnings用來抑制編譯器生成警告信息。

可以修飾的元素為類,方法,方法參數,屬性,局部變量.

使用場景:當我們一個方法調用了棄用的方法或者進行不安全的類型轉換,編譯器會生成警告。我們可以為這個方法增加@SuppressWarnings註解,來抑制編譯器生成警告。

註意:使用@SuppressWarnings註解,采用就近原則,比如一個方法出現警告,我們盡量使用@SuppressWarnings註解這個方法,而不是註解方法所在的類。雖然兩個都能抑制編譯器生成警告,但是範圍越小越好,因為範圍大了,不利於我們發現該類下其他方法的警告信息。

創建自己的註解

Java中,我們可以創建自己的註解,註解和類,接口文件一樣定義在自己的文件裏面。如下:

仔細一看,你會發現,註解元素的定義很類似於接口的方法。這些元素有類型和名稱。這些類型可以是

l 原始數據類型

l String

l Class

l annotation

l 枚舉

l 一維數組

註解元素默認值

對於註解中的元素,我們可以為其設置默認值,使用方法為:

@Retention

@Retention是用來修飾註解的註解,使用這個註解,我們可以做到:

  1. 控制註解是否寫入class文件
  2. 控制class文件中的註解是否在運行時可見

控制很簡單,使用使用以下三種策略之一即可。

RetentionPolicy.SOURCE 表明註解僅存在源碼之中,不存在.class文件,更不能運行時可見。常見的註解為@Override, @SuppressWarnings

RetentionPolicy.CLASS 這是默認的註解保留策略。這種策略下,註解將存在與.class文件,但是不能被運行時訪問。通常這種註解策略用來處於一些字節碼級別的操作。

RetentionPolicy.RUNTIME 這種策略下可以被運行時訪問到。通常情況下,我們都會結合反射來做一些事情。

@Target

使用@Target註解,我們可以設定自定義註解可以修飾哪些java元素。簡單示例:

@Target可以選擇的參數值有如下這些:

  • ElementType.ANNOTATION_TYPE 應用於其他註解的元註解
  • ElementType.CONSTRUCTOR 構造函數
  • ElementType.FIELD 字段
  • ElementType.LOCAL_VARIABLE 方法中的本地變量
  • ElementType.METHOD 方法
  • ElementType.PACKAGE
  • ElementType.PARAMETER 方法的參數
  • ElementType.TYPE 類,接口或者枚舉聲明

@Inherited

如果你想讓一個類和它的子類都包含某個註解,就可以使用@Inherited來修飾這個註解。

l 使用@Inherited修飾註解MyAnnotation

l 使用MyAnnotation註解MySuperClass

l 實現一個類MySubclass繼承自MySuperClass

通過以上幾步,MySubClass也擁有了MyAnnotation註解。

Java中的註解的詳解