1.Annocation的使用示例
示例一:生成文檔相關的註解
示例二:在編譯時進行格式檢查(JDK內置的三個基本註解)
@Override:限定重寫父類方法,該註解只能用於方法
@Deprecated:用於表示所修飾的元素(類,方法等)已過時
@SuppressWarnings:抑制編譯器警告
2.自定義註解:
3.JDK中的元註解
4.例子
@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"; }
@Inherited @Retention(RetentionPolicy.RUNTIME) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) public @interface MyAnnotations { MyAnnotation[] value(); }
/** * 註解的使用 * * 1. 理解Annotation: * ① jdk 5.0 新增的功能 * * ② Annotation 其實就是代碼裏的特殊標記, 這些標記可以在編譯, 類加載, 運行時被讀取, 並執行相應的處理。通過使用 Annotation, * 程序員可以在不改變原有邏輯的情況下, 在源文件中嵌入一些補充信息。 * * ③在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/Android * 中註解佔據了更重要的角色,例如用來配置應用程序的任何切面,代替JavaEE舊版中所遺留的繁冗 * 代碼和XML配置等。 * * 2. Annocation的使用示例 * 示例一:生成文檔相關的註解 * 示例二:在編譯時進行格式檢查(JDK內置的三個基本註解) @Override: 限定重寫父類方法, 該註解只能用於方法 @Deprecated: 用於表示所修飾的元素(類, 方法等)已過時。通常是因爲所修飾的結構危險或存在更好的選擇 @SuppressWarnings: 抑制編譯器警告 * 示例三:跟蹤代碼依賴性,實現替代配置文件功能 * * 3. 如何自定義註解:參照@SuppressWarnings定義 * ① 註解聲明爲:@interface * ② 內部定義成員,通常使用value表示 * ③ 可以指定成員的默認值,使用default定義 * ④ 如果自定義註解沒有成員,表明是一個標識作用。 如果註解有成員,在使用註解時,需要指明成員的值。 自定義註解必須配上註解的信息處理流程(使用反射)纔有意義。 自定義註解通過都會指明兩個元註解:Retention、Target 4. jdk 提供的4種元註解 元註解:對現有的註解進行解釋說明的註解 Retention:指定所修飾的 Annotation 的生命週期:SOURCE\CLASS(默認行爲)\RUNTIME 只有聲明爲RUNTIME生命週期的註解,才能通過反射獲取。 Target:用於指定被修飾的 Annotation 能用於修飾哪些程序元素 *******出現的頻率較低******* Documented:表示所修飾的註解在被javadoc解析時,保留下來。 Inherited:被它修飾的 Annotation 將具有繼承性。 5.通過反射獲取註解信息 ---到反射內容時系統講解 6. jdk 8 中註解的新特性:可重複註解、類型註解 6.1 可重複註解:① 在MyAnnotation上聲明@Repeatable,成員值爲MyAnnotations.class ② MyAnnotation的Target和Retention等元註解與MyAnnotations相同。 6.2 類型註解: ElementType.TYPE_PARAMETER 表示該註解能寫在類型變量的聲明語句中(如:泛型聲明)。 ElementType.TYPE_USE 表示該註解能寫在使用類型的任何語句中。 * * @author shkstart * @create 2019 上午 11:37 */ public class AnnotationTest { public static void main(String[] args) { Person p = new Student(); p.walk(); Date date = new Date(2020, 10, 11); System.out.println(date); @SuppressWarnings("unused") int num = 10; // System.out.println(num); @SuppressWarnings({ "unused", "rawtypes" }) ArrayList list = new ArrayList(); } @Test public void testGetAnnotation(){ Class clazz = Student.class; Annotation[] annotations = clazz.getAnnotations(); for(int i = 0;i < annotations.length;i++){ System.out.println(annotations[i]); } } } //jdk 8之前的寫法: //@MyAnnotations({@MyAnnotation(value="hi"),@MyAnnotation(value="hi")}) @MyAnnotation(value="hi") @MyAnnotation(value="abc") class Person{ private String name; private int age; public Person() { } @MyAnnotation public Person(String name, int age) { this.name = name; this.age = age; } @MyAnnotation public void walk(){ System.out.println("人走路"); } public void eat(){ System.out.println("人喫飯"); } } interface Info{ void show(); } class Student extends Person implements Info{ @Override public void walk() { System.out.println("學生走路"); } public void show() { } } class Generic<@MyAnnotation T>{ public void show() throws @MyAnnotation RuntimeException{ ArrayList<@MyAnnotation String> list = new ArrayList<>(); int num = (@MyAnnotation int) 10L; } }