一、理解Annotation
- jdk5.0新增的功能,
- 是代碼里的特殊標記,可以在編譯、類加載、運行時被讀取,并執行相應的處理,通過使用Annotation,程式員可以在不改變原有邏輯的情況下,在源檔案中嵌入一些補充資訊,
- 在JavaSE中,注解的使用目的比較簡單,在JavaEE與Android中注解占據了更重要的角色,
二、Annotation的使用示例
示例一:生成檔案相關的注解
示例二:在編譯時進行格式檢查(JDK內置的三個基本注解)
- @Override:限定重寫父類方法,該注解只能用于方法,
- @Deprecated:用于表示所修飾的元素(類,方法等)已過時,通常是因為所修飾的結構危隙訓存在更好的選擇,
- @SuppressWarnings:抑制編譯器警告,
示例三:跟蹤代碼依賴性,實作替代組態檔功能
三、如何自定義注解
參照@SuppressWarnings定義
- 注解宣告為:@interface
- 內部定義成員,通常使用value表示
- 可以指定成員的默認值,使用default定義
- 如果自定義注解沒有成員,表明是一個標識作用
如果注解有成員,在使用注解時,需要指明成員的值,
自定義注解必須配上注解的資訊處理流程(使用反射)才有意義,
自定義注解通常都會指明兩個元注解:Retention、Target
四、jdk提供的四種元注解
元注解:對現有的注解進行解釋說明的注解
- Retention:指定所修飾的Annotation的生命周期:SOURCE\CLASS\RUNTIME,只有宣告為RUNTIME生命周期的注解,才能通過反射獲取,
- Target:用于指定被修飾的Annotation能用于修飾哪些程式元素,
(以下兩個注解出現頻率較低) - Document:表示所修飾的注解在被javadoc決議時,保留下來,
- Inherited:被它修飾的Annotation將具有繼承性,
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
String value() default "hello";
}
五、通過反射獲取注解資訊
@Test
public void testGetAnnotation() {
Class<Student> studentClass = Student.class;
Annotation[] annotations = studentClass.getAnnotations();
for (int i = 0; i < annotations.length; i++) {
System.out.println(annotations[i]);
}
}
六、jdk8中注解的新特性
-
可重復注解:
- 在MyAnnotation上宣告@Repeatable,成員值為MyAnnotations.class
- MyAnnotation中的Target、Retention等元注解與MyAnnotations相同,
//jdk8之前的寫法:
//@MyAnnotations({@MyAnnotation("hi"),@MyAnnotation("abc")})
@MyAnnotation("hi")
@MyAnnotation("abc")
-
型別注解:
- ElementType.TYPE_PARAMETER:表示該注解能寫在型別變數的宣告陳述句中(如:泛型宣告),
- ElementType.TYPE_USE:表示該注解能寫在使用型別的任何陳述句中,
class Generic<@MyAnnotation T>{
public void show() throws @MyAnnotation RuntimeException{
ArrayList<@MyAnnotation String> list = new ArrayList<>();
int num = (@MyAnnotation int)10L;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/287528.html
標籤:Java
上一篇:列舉類
