註解的註解就是爲註解自己提供額外的信息,從而約束或加強註解的能力。其中包含有 @Documented 、 @Inherited 、 @Target 、 Retention 4種註解。 @Target註解 :用於約束被描述的註解的使用範圍,當被描述的註解超出使用範圍則編譯失敗。 // 約束@MyAnnotation的做用範圍是函數和構造函數 @Target(ElementType.METHOD, ElementType.CONSTRUCTOR) public @interface MyAnnotation{} @Retention註解 :用於約束被描述的註解的做用範圍,註解的做用範圍有三個,分別爲 1. RetentionPolicy.SOURCE ,做用範圍爲源碼,就是僅存在於java文件中,當執行 javac 命令時將會去除該註解。java
2. RetentionPolicy.CLASS ,做用範圍爲二進制碼,就是存在於class文件中,當執行 java 命令時會去除該註解。函數
3. RetentionPolicy.RUNTIME ,做用範圍爲運行時,就是咱們能夠經過反射動態獲取該註解。 @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation{} @Documented註解 :用於指定javadoc生成API文檔時顯示該註解信息 @Inherited註解 :用於指定被描述的註解能夠被其所描述的類的子類繼承。默認狀況 // 默認註解不會被子類繼承 @MyAnnotation public class Parent{} // Son並無繼承註解MyAnnotation public class Son extends Parent{} 經過 @Inherited 子類將會繼承父類的 @MyAnnoation註解 。.net
4、讀取註解 經過反射咱們能夠獲取類、函數等上的註解信息。 複製代碼 @Retention(RetentionPolicy.RUNTIME)繼承
@Target(ElementType.CLASS)文檔
@Documented public @interface MyAnnotaion{ String value() default "hello world"; } @MyAnnotation public class Test{ public static void main(String[] args){get
MyAnnotation ma = Test.class.getAnnotation(MyAnnotation.class);源碼
System.out.println(ma.value());it
// 獲取自身和從父類繼承的註解io
Annotation[] annotations = Test.class.getAnnotations();編譯
// 僅獲取自身的註解
Annotation[] annotations = Test.class.getDeclaredAnnotations(); } }