首頁 >Java >java教程 >一篇文章帶你看懂java中的註解

一篇文章帶你看懂java中的註解

无忌哥哥
无忌哥哥原創
2018-07-23 10:45:142185瀏覽

註解這個東西,只要是一個java的開放人員都不會陌生,但是我們用了那麼多的註解,我們的註解是怎樣為我們工作的呢?透過前段時間的學習,我對註解有了一點新的理解。

一、什麼是註解

註解在我們通俗的看來,就是一個對於Annotation介面的一個實現,他和類別還有介面是處於同一個宣告和使用層級的,都繼承了Object基類,並且都有.class屬性。

但是註解本身真的起作用嗎?

不信你自己定義一個註解試試,然後放在你的程式碼上,結果就是毛用都沒有。

我們可以將註解看做是一個帶有屬性的標記,我們給我們的程式碼打上這個標記,就意味著我們的程式碼具有了註解所代表的某些特性了,但是不代表我們給他打上註解的一瞬間就有這種特性了。

我們的程式碼在運行前是需要進行編譯的,有的時候在運行時我們也是需要進行動態編譯的,這個時候,如果我們嵌入了反射,或者動態代理的程式碼去解析這個類,並給這個類加上他應有的特性,這個時候類才具有了註解所代表的意義。

舉個例子,例如我們在上幼兒園的時候,上廁所是需要舉手,然後老師帶領著去的,這個時候,舉手就代表你打上了上廁所的註解,如果老師不鳥你的話,你是上不了廁所的,只能憋著,如果老師這個時候掃視全班,發現你舉手了,她才會去你那裡帶著你和一群都在舉手的同學一起去上廁所。這時候你才發揮了上廁所的本領。

二、實作

我們看到的註解,大部分其實都不是一開始java給你定義好的,一開始就規定了的註解只有最開始的四個元註解,他們分別是:

  •    @Documented –註解是否將包含在JavaDoc中

  •    @Retention –什麼時候使用該註解

  •  @Target –註解用於什麼地方

  • #@Inherited – 是否允許子類別繼承該註解

#@Documented ,這個註解的意思是,在我們產生javaDoc的時候是否把這個類別的說明,或者方法的說明放在我們的java文件中。一般如果不用java自備的專案文檔工具產生文檔的話是沒有什麼用處的。

@Retention,這個註解表示了我們定義註解的生命週期,以下就是它的各種賦值和作用說明:

  1. RetentionPolicy.SOURCE : 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入字節碼。 @Override, @SuppressWarnings都屬於這類註解。

  2.  RetentionPolicy.CLASS : 在類別載入的時候丟棄。在字節碼檔案的處理中有用。註解預設使用這種方式

  3. RetentionPolicy.RUNTIME : 永遠不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的資訊。我們自訂的註解通常使用這種方式

@Target ,表示了註解用於什麼地方的標記,預設為標記任何元素,可以給裡面賦值ElementType的值:

  1.  ElementType.CONSTRUCTOR:用於描述建構器

  2. #ElementType.FIELD:成員變數、物件、屬性(包含enum實例)

  3. ElementType.LOCAL_VARIABLE:用來描述局部變數

  4.  ElementType.METHOD:用來描述方法

  5. ElementType.PACKAGE:用於描述套件

  6.  ElementType.PARAMETER:用於描述參數

  7. ElementType.TYPE:用於描述類別、接口(包括註解類型) 或enum宣告

@Inherited ,定義該註解和子類別的關係,@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類別。

我們可以自訂一個註解:

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 水果名称注解
 */
@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}

上述的元註解就是為了自訂註解服務的。

三、總結

總之,註解就是一個用來標記程式碼的標記,我們可以透過掃描不同的註解來實現不同的註解方法,透過java的動態代理和反射我們可以輕鬆的獲得我們註解標記的內容,從而操作我們寫好的類別或方法,下篇文章,我將定義一個自訂的註解,並寫出他的實作。

以上是一篇文章帶你看懂java中的註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn