註解這個東西,只要是一個java的開放人員都不會陌生,但是我們用了那麼多的註解,我們的註解是怎樣為我們工作的呢?透過前段時間的學習,我對註解有了一點新的理解。
註解在我們通俗的看來,就是一個對於Annotation介面的一個實現,他和類別還有介面是處於同一個宣告和使用層級的,都繼承了Object基類,並且都有.class屬性。
但是註解本身真的起作用嗎?
不信你自己定義一個註解試試,然後放在你的程式碼上,結果就是毛用都沒有。
我們可以將註解看做是一個帶有屬性的標記,我們給我們的程式碼打上這個標記,就意味著我們的程式碼具有了註解所代表的某些特性了,但是不代表我們給他打上註解的一瞬間就有這種特性了。
我們的程式碼在運行前是需要進行編譯的,有的時候在運行時我們也是需要進行動態編譯的,這個時候,如果我們嵌入了反射,或者動態代理的程式碼去解析這個類,並給這個類加上他應有的特性,這個時候類才具有了註解所代表的意義。
舉個例子,例如我們在上幼兒園的時候,上廁所是需要舉手,然後老師帶領著去的,這個時候,舉手就代表你打上了上廁所的註解,如果老師不鳥你的話,你是上不了廁所的,只能憋著,如果老師這個時候掃視全班,發現你舉手了,她才會去你那裡帶著你和一群都在舉手的同學一起去上廁所。這時候你才發揮了上廁所的本領。
我們看到的註解,大部分其實都不是一開始java給你定義好的,一開始就規定了的註解只有最開始的四個元註解,他們分別是:
@Documented –註解是否將包含在JavaDoc中
@Retention –什麼時候使用該註解
@Target –註解用於什麼地方
#@Inherited – 是否允許子類別繼承該註解
#@Documented ,這個註解的意思是,在我們產生javaDoc的時候是否把這個類別的說明,或者方法的說明放在我們的java文件中。一般如果不用java自備的專案文檔工具產生文檔的話是沒有什麼用處的。
@Retention,這個註解表示了我們定義註解的生命週期,以下就是它的各種賦值和作用說明:
RetentionPolicy.SOURCE : 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入字節碼。 @Override, @SuppressWarnings都屬於這類註解。
RetentionPolicy.CLASS : 在類別載入的時候丟棄。在字節碼檔案的處理中有用。註解預設使用這種方式
RetentionPolicy.RUNTIME : 永遠不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的資訊。我們自訂的註解通常使用這種方式
@Target ,表示了註解用於什麼地方的標記,預設為標記任何元素,可以給裡面賦值ElementType的值:
ElementType.CONSTRUCTOR:用於描述建構器
#ElementType.FIELD:成員變數、物件、屬性(包含enum實例)
ElementType.LOCAL_VARIABLE:用來描述局部變數
ElementType.METHOD:用來描述方法
ElementType.PACKAGE:用於描述套件
ElementType.PARAMETER:用於描述參數
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中文網其他相關文章!