JDK1.5開始,Java增長了對元數據(即類的組成單元數據)的支持,也就是註解(Annotation),他是代碼裏作的特殊標記,這些標記能夠在編譯、類加載、運行時在不改變原有邏輯的狀況下被讀取,並執行相應的處理,經過使用Annotation,程序員能夠在原文件中嵌入一些補充的信息。代碼分析工具、開發工具和部署工具能夠經過這些補充信息進行驗證或者進行部署。Annotation相似於修飾符同樣被使用,能夠用於包、類、構造方法、方法、成員變量、參數、局部變量的聲明。
java
注意:Annotation是個接口,程序能夠經過反射來獲取指定的程序元素的Anotation對象,而後經過Annotation對象來得到註解裏面的元數據。Annotation有時是指java.lang.Annotation,有時指註解自己。程序員
在JDK1.5以後,在系統中提供了三個Annotation,分別是:@Override、@Deprecated、@SuppressWarningside
@Override工具
它的做用是對覆蓋超類中方法的方法進行標記,若是被標記的方法並無實際覆蓋超類中的方法,則編譯器會發出錯誤警告。開發工具
@Deprecated測試
表示這一個類或方法已過期,再也不建議繼續使用了。
spa
@SuppressWarningscode
表示關閉不當的編譯器警告信息。
對象
其參數有:
接口
deprecation,使用了過期的類或方法時的警告
unchecked,執行了未檢查的轉換時的警告
fallthrough,當Switch程序塊直接通往下一種狀況而沒有break時的警告
path,在類路徑、源文件路徑等中有不存在的路徑時的警告
finally,任何finally子句不能正常完成時的警告
all,關於以上全部狀況的警告
下面看一個小例子:
package com.main; public class Person { @Override public String toString() { return "測試@Override"; } @Deprecated public void print() { System.out.println("測試@Deprecated"); } }
註解應用須要三個步驟:
編寫註釋
在類上應用註釋
對應用了註釋的類進行反射操做的類
自定義Annotation的語法以下:
訪問控制權限 @interface Annotation名稱{}
例如:
public @interface MyAnnotation{}
package com.main; /** * 自定義註解 * @author lenovo */ public @interface MyAnnotation { // 定義變量 public String name(); public int age(); public String info() default "學生";// 爲變量info設置默認值 }
package com.main; @MyAnnotation(age = 18, name = "小明") public class Person {
Annotation要想決定其做用的範圍,能夠經過@Retention指定,而Retention指定的範圍由RetentionPolicy決定,RetentionPolicy指定了三種範圍:
範圍 | 描述 |
public static final RetentionPolicy SOURCE | 在java源程序中存在 |
public static final RetentionPolicy CLASS | 在java生成的class中存在 |
public static final RetentionPolicy RUNTIME | 在java運行的時候存在 |
示例:
package com.main; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * 自定義註解 * @author lenovo */ @Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { // 定義變量 public String name(); public int age(); public String info() default "學生";// 爲變量info設置默認值 }
一個Annotation真正起做用,必須結合反射機制,在反射中提供瞭如下的操做方法:
java.lang.reflect.AccessibleObject
方法名稱 | 描述 |
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) | 判斷是不是指定的Annotation |
public Annotation[] getAnnotations() |
獲得所有的Annotation |
實例:
package com.main; import java.lang.annotation.Annotation; public class AnnotationTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException { Class personClass = Person.class; Annotation annotation = personClass.getAnnotation(MyAnnotation.class); MyAnnotation myAnnotation = (MyAnnotation) annotation; String name = myAnnotation.name(); int age = myAnnotation.age(); Person p1 = (Person) personClass.newInstance(); p1.setName(name); p1.setAge(age); System.out.println(p1); } }