註解(也被稱為中繼資料)為我們在代碼中添加資訊提供了一種形式化的方法,使我們可以在稍後某個時刻非常方便地使用這些資料。
1 基本文法
被註解的方法與其他的方法沒有區別。註解可以與任何修飾符共同作用於方法,例如,public, static或void。從文法的角度來看,註解的使用方式幾乎與修飾符的使用一模一樣。
1.1 定義註解
註解的定義看起來很像介面的定義。事實上,與其他任何Java介面一樣,註解也將會編譯成class檔案。
定義註解時會需要一些元註解(meta-annotation),如@Target
,@Retention
。
在註解中,一般都會包含一些元素以表示某些值。當分析處理註解時,程式或工具可以利用這些值。註解的元素看起來就像介面的方法,唯一的區別是你可以為其指定預設值。元素的類型有限制。
沒有元素的註解稱為標記註解(marker annotation)。
所有註解都繼承了annotation
。
package net.mrliuli.annotations;import java.lang.annotation.*;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Test {} //(marker annotation)
1.2 三種標準註解和四種元註解
定義在java.lang
中的三種標準註解:
@Overrided
@Deprecated
@SuppressWarnings
四種元註解:
1.3 關於註解
註解元素的類型有限制,不可以是任意類型,使用除允許類型以外的類型編譯器會報錯。
預設值限制:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface SimulationNull{ public int id() default -1; public String description() default "";}
首先,元素不能有不確定的值。也就是說,元素必須要麼具有預設值,要麼在使用註解時提供元素的值。
其次,對於非基本類型的元素,無論是在原始碼中聲明時,或是在註解介面中定義預設值時,都不能以null
作為其值。這個約束使得註解處理器很難表現一個元素的存在或缺失的狀態,因為在每個註解的聲明中,所有的元素都存在,並且都具有相應的值。為了繞開這個約束,我們只能自己定義一些特殊的值例如Null 字元串或負數,以此表示某個元素不存在:
產生外部檔案。有些framework需要一些額外的資訊才能與你的原始碼協同工作,而這種情況最適合註解表現其價值了。像Enterprise JavaBean這樣的技術,需要部署描述檔案。Web Service、自訂標籤庫以及對象/關係映射工具(如Toplink和Hibernate)等,一般都需要XML描述檔案,而這些描述檔案脫離於原始碼之外。
2 編寫註解處理器
使用註解的過程中,很重要的一部分就是建立與使用註解處理器,用來讀取註解。
反射機制的API可以構造註解處理器
外部工具apt可以解析帶有註解的Java原始碼
相關文章:
Java編程思想學習課時(五)第18章-Java IO系統
Java編程思想學習課時(六)第19章-枚舉類型