標籤:java 註解
註解簡單的理解成在代碼中加註額外資訊的一種手段,這些資訊可以再稍後的某個時刻使用,使用時與反射配合。主要用來:
從分類上看來,java定義了三類註解:
- jdk內建的系統註解,編譯時間檢查(@Override,@Deprecated,@SuppressWarnings)
- 元註解,專職負責註解其他註解(@Target,@Retention,@Documented,@Inherited)
- 自訂註解
一般說來,註解存在於一個單獨的.java檔案中,會被編譯成.class檔案。
系統內建註解
@Override用來編譯時間檢查方法覆蓋父類方法,只能修飾方法。查看@Override的實現可以看到:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override { }
@Override註解被兩個元註解修飾,@Target和@Retention。這兩個註解分別表示@Override這個註解修飾的是方法,並且只保留在源碼層級,編譯時間將被編譯器丟棄。
@Deprecated用來提示這個部分已經不推薦使用,已經過時
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})public @interface Deprecated { }
從代碼可以看出,不推薦使用的部分可以使類,介面,構造器,域聲明,局部變數,方法聲明,參數聲明。VM在運行期間也保留註解。@Documented說明這個註解包含在javadoc中。
@SuppressWarnings關閉編譯器不當的警告資訊
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings { String[] value();}
定義體裡面的 String[] value(); 是註解元素,可以想象成變數。使用時需要為@SuppressWarnings的value指定值。例如:
@SuppressWarnings(value={ "deprecation", "unchecked" })
表示關閉過時警告和未檢查的類型轉換警告
元註解
@Target 表示該註解使用範圍,可能的ElementType參數包括:
- CONSTRUCTOR:構造器的聲明
- FIELD:域聲明(包括enum執行個體)
- LOCAL_VARIABLE:局部變數聲明
- METHOD:方法聲明
- PACKAGE:包生明
- PARAMETER:參數聲明
- TYPE:類,介面(包括註解類型)或enum類型
@Retention 表示註解的保留層級,可能的RetentionPolicy參數包括:
- SOURCE:註解將被編譯器丟棄
- CLASS:註解在class檔案中可用,但會被VM丟棄
- RUNTIME:VM將在運行期也保留註解,因此可以通過反射機制讀取註解裡的資訊
@Documented 將註解包含在javadoc中
@Inherited 允許子類繼承父類中的註解
自訂註解
定義方式很像,例如:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Test{ public int id(); public String description() default "no description";}
id是int類型的註解元素,description是String類型的註解元素,預設值”no description”。沒有設定預設值的註解元素需要在使用時顯示賦值,就像@SuppressWarnings一樣。因為保留類型是RUNTIME,所以能夠在程式運行期間拿到。例如:
class TT { @Test(id = 0) public void annot0() { System.out.println("runtime annotation test"); } @Test(id = 1, description = "just for fun") public void annot1() { }}public class App{ public static void main( String[] args ) { Class<?> cl = TT.class; for(Method m : cl.getDeclaredMethods()) { Test t = m.getAnnotation(Test.class); if(t != null) { System.out.println("Found Annotation Test: id="+t.id() +" descripition="+t.description()); } } }}
輸出:
Found Annotation Test: id=0 descripition=no description
Found Annotation Test: id=1 descripition=just for fun
註解元素可以包含的類型有:
- 所有基本類型(int,float,boolean等)
- String
- Class
- enum
- Annotation
- 以上類型的數組
通過自訂註解,並編寫出街處理器,可以在運行時利用註解幹很多有意思的事情。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java註解簡介