Java 中的註解詳解及範例程式碼_java

來源:互聯網
上載者:User

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

註解可以做什麼

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

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

其中

  1. Java內建了三種編譯器指令,本文後面部分會重點介紹
  2. Java註解可以應用在構建時,即當你構建你的項目時。構建過程包括產生源碼,編譯源碼,產生xml檔案,打包編譯的源碼和檔案到JAR包等。軟體的構建通常使用諸如Apache Ant和Maven這種工具自動完成。這些構建工具會依照特定的註解掃描Java代碼,然後根據這些註解產生源碼或檔案。
  3. 通常情況下,註解並不會出現在編譯後的代碼中,但是如果想要出現也是可以的。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")

註解使用

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

  1. 類
  2. 介面
  3. 方法
  4. 方法參數
  5. 屬性
  6. 局部變數

一個完整的使用樣本如下

@Entitypublic class Vehicle {  @Persistent  protected String vehicleName = null;  @Getter  public String getVehicleName() {    return this.vehicleName;  }  public void setVehicleName(@Optional vehicleName) {    this.vehicleName = vehicleName;  }  public List addVehicleNameToList(List names) {    @Optional    List localNames = names;    if(localNames == null) {      localNames = new ArrayList();    }    localNames.add(getVehicleName());    return localNames;  }}

內建的Java註解

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

  1. @Deprecated
  2. @Override
  3. @SuppressWarnings

@Deprecated

可以用來標記類,方法,屬性。
如果上述三種元素不再使用,使用@Deprecated註解
如果代碼使用了@Deprecated註解的類,方法或屬性,編譯器會進行警告。

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

@Deprecatedpublic class MyComponent {}

當我們使用@Deprecated註解後,建議配合使用對應的@deprecated JavaDoc符號,並解釋說明為什麼這個類,方法或屬性被棄用,已經替代方案是什麼。

@Deprecated/** @deprecated This class is full of bugs. Use MyNewComponent instead.*/public class MyComponent {}

@Override

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

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

使用Override註解的例子

public class MySuperClass {  public void doTheThing() {    System.out.println("Do the thing");  }}public class MySubClass extends MySuperClass{  @Override  public void doTheThing() {    System.out.println("Do it differently");  }}

@SuppressWarnings

@SuppressWarnings用來抑制編譯器產生警告資訊。

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

使用情境:當我們一個方法調用了棄用的方法或者進行不安全的類型轉換,編譯器會產生警告。我們可以為這個方法增加

@SuppressWarnings註解,來抑制編譯器產生警告。

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

使用樣本

@SuppressWarningspublic void methodWithWarning() {}

建立自己的註解

在Java中,我們可以建立自己的註解,註解和類,介面檔案一樣定義在自己的檔案裡面。如下

@interface MyAnnotation {  String  value();  String  name();  int   age();  String[] newNames();}

上述代碼定義了一個叫做MyAnnotation的註解,它有4個元素。再次強調一下,@interface這個關鍵字用來告訴java編譯器這是一個註解。

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

  1. 未經處理資料類型
  2. String
  3. Class
  4. annotation
  5. 枚舉
  6. 一維數組

如下為應用自訂的註解

@MyAnnotation(  value="123",  name="Jakob",  age=37,  newNames={"Jenkov", "Peterson"})public class MyClass {}

注意,我們需要為所有的註解元素設定值,一個都不能少。

註解元素預設值

對於註解中的元素,我們可以為其設定預設值,使用方法為

@interface MyAnnotation {  String  value() default "";  String  name();  int   age();  String[] newNames();}

上述代碼,我們設定了value元素的預設值為空白字串。當我們在使用時,可以不設定value的值,即讓value使用Null 字元串預設值。 使用範例程式碼

@MyAnnotation(  name="Jakob",  age=37,  newNames={"Jenkov", "Peterson"})public class MyClass {}

@Retention

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

控制註解是否寫入class檔案
控制class檔案中的註解是否在運行時可見

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

RetentionPolicy.SOURCE 表明註解僅存在源碼之中,不存在.class檔案,更不能運行時可見。常見的註解為@Override, @SuppressWarnings。
RetentionPolicy.CLASS 這是預設的註解保留原則。這種策略下,註解將存在與.class檔案,但是不能被運行時訪問。通常這種註解策略用來處於一些位元組碼層級的操作。
RetentionPolicy.RUNTIME 這種策略下可以被運行時訪問到。通常情況下,我們都會結合反射來做一些事情。

@Retention的使用樣本

import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)@interface MyAnnotation {  String  value() default "";}

@Target

使用@Target註解,我們可以設定自訂註解可以修飾哪些java元素。簡單樣本

import java.lang.annotation.ElementType;import java.lang.annotation.Target;@Target({ElementType.METHOD})public @interface MyAnnotation {  String  value();}

上述的代碼說明MyAnnotation註解只能修飾方法。

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

  1. ElementType.ANNOTATION_TYPE(註:修飾註解)
  2. ElementType.CONSTRUCTOR
  3. ElementType.FIELD
  4. ElementType.LOCAL_VARIABLE
  5. ElementType.METHOD
  6. ElementType.PACKAGE
  7. ElementType.PARAMETER
  8. ElementType.TYPE(註:任何類型,即上面的的類型都可以修飾)

@Inherited

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

java.lang.annotation.Inherited@Inheritedpublic @interface MyAnnotation {}12@MyAnnotationpublic class MySuperClass { ... }1public class MySubClass extends MySuperClass { ... }

上述代碼的大致意思是

1.使用@Inherited修飾註解MyAnnotation
2.使用MyAnnotation註解MySuperClass
3.實現一個類MySubclass繼承自MySuperClass

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

關於Java中的註解,一些基本的概念就是這些。

以上 就是關於Java 中的註解資料整理,後續繼續補充相關資料,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.