(1)註解不是程序自己(也就是說Annotation不能影響程序代碼的執行,不管增長、刪除 Annotation,代碼都始終如一的行),能夠對程序做出解釋(和註釋沒區別) (2)能夠被其餘程序(好比:編譯器等)讀取
(1)生成文檔。如生成javadoc的@see @param @return (2)跟蹤代碼依賴性,實現替代配置文件的功能。如spring中@Service等註解。 (3)在編譯時期進行格式檢查。如@Override放在方法前,若是你的方法不是覆蓋超類的方法,編譯時期就會報錯。
「@註釋名」在代碼中存在,還能夠添加一些參數. 例如:@SuppreWarning(value="unchecked") 註解能夠附加在package,class,method,field等上面,至關於給它們添加了額外的輔助信息,咱們能夠經過反射機制編程實現對這些元數據的訪問。 class Demo{ @Override public Stirng toStirng(){ return ""; } }
@Override 只使用於修飾方法,表示一個方法聲明打算重寫超類中的另外一個方法聲明 @Deprecated 修飾方法,屬性,類,表示不鼓勵程序員使用這樣的元素 @SuppressWarnings抑制編譯期發出某些警告 | ----------- | --------------------------------------------------- | | deprecation | 過期的類或方法警告 | | ----------- | --------------------------------------------------- | | unchecked | 未檢查的轉換時警告 | | ----------- | --------------------------------------------------- | | fallthrough | switch語句穿透警告 | | ----------- | --------------------------------------------------- | | pat | 類路徑、源文件路徑等有不存在的路徑時的警告 | | ----------- | --------------------------------------------------- | | serial | 在可序列化的類上缺乏serialVersionUID定義時警告 | | ----------- | --------------------------------------------------- | | all | 關於上面的全部狀況的警告 | | ----------- | --------------------------------------------------- |
元註解: @Target,@Retention,@Documented,@Inherited | --------------------------- | ---------------------------------- | | ElemenetType.FIELD | 域聲明(包括 enum 實例) | | --------------------------- | ---------------------------------- | | ElemenetType.LOCAL_VARIABLE | 局部變量聲明 | | --------------------------- | ---------------------------------- | | ElemenetType.CONSTRUCTOR | 構造器 | | --------------------------- | ---------------------------------- | | ElemenetType.METHOD | 方法聲明 | | --------------------------- | ---------------------------------- | | ElemenetType.PACKAGE | 包聲明 | | --------------------------- | ---------------------------------- | | ElemenetType.PARAMETER | 參數聲明 | | --------------------------- | ---------------------------------- | | ElemenetType.TYPE | 類,接口(包括註解類型)或enum聲明 | | ------- | ---------------------------------------- | | SOURCE | 源文件中保留,class文件不保留 | | ------- | ---------------------------------------- | | CLASS | class文件保留,不加載到內存,運行時不保留 | | ------- | ---------------------------------------- | | RUNTIME | 運行時能夠經過反射得到註解內容 |
自定義註解默認值問題: html
註解必需要有值。咱們定義註解元素時,常常使用空字符串、0做爲默認值。 也常常使用負數(好比:-1)表示不存在的含義。java
/** * 學生名註解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface StudentName { String value() default ""; } /** * 學生性別註解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface StudentSex { /** * 性別枚舉 */ public enum Sex {GRIL, BOY}; /** * 性別屬性 * @return */ Sex studentSex() default Sex.BOY; } /** * 學校註解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface School { /** * 學校名稱 */ public String name() default ""; /** * 學校排名 * @return */ public int id() default -1; } /** * 使用註解 */ public class Student { @StudentName("ximing") private String name; @StudentSex(studentSex = StudentSex.Sex.GRIL) private String sex; @School(name = "北大", id = 1) private String school; } /** * 讀取註解信息 */ public class HandleAnnotation { public static void getStudentInfo(Class<?> clazz){ String strStudentName = "學生名稱: "; String strStudentSex = "學生性別: "; String strStudentSchool = "學生所在學校: "; Field[] fields = clazz.getDeclaredFields(); for(Field field : fields){ if(field.isAnnotationPresent(StudentName.class)){ StudentName studentName = field.getAnnotation(StudentName.class); strStudentName = strStudentName + studentName.value(); System.out.println(strStudentName); }else if(field.isAnnotationPresent(StudentSex.class)){ StudentSex studentSex = field.getAnnotation(StudentSex.class); strStudentSex = strStudentSex + studentSex.studentSex().toString(); System.out.println(strStudentSex); }else if(field.isAnnotationPresent(School.class)){ School school = field.getAnnotation(School.class); strStudentSchool = strStudentSchool + "學校名稱: " + school.name().toString() + "排名: " + school.id(); System.out.println(strStudentSchool); } } } public static void main(String[] args) { HandleAnnotation.getStudentInfo(Student.class); } } //執行結果 學生名稱: ximing 學生性別: GRIL 學生所在學校: 學校名稱: 北大排名: 1
推薦博客:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html程序員