1. 程式人生 > >Java基礎 -- 註解Annotation

Java基礎 -- 註解Annotation

註解的概念:

可以簡單的將註解理解為標籤(標籤裡面的內容就是註解內的元素),想釘在哪就釘在哪,比如:釘在型別上(類/介面/列舉),釘在類的資料成員上,釘在類的方法成員上,釘在方法的入參上,甚至釘在別的註解上等等。

官方下的註解含義為:註解是一系列元資料,它提供資料用來解釋程式程式碼,但是註解並非程式碼本身的一部分。註解對於程式碼的執行效果沒有直接影響。 

 註解有許多用處,主要如下:
- 提供資訊給編譯器: 編譯器可以利用註解來探測錯誤和警告資訊
- 編譯階段時的處理:  軟體/工具/框架可以讀取註解資訊來生成程式碼/Html文件或者其它處理
- 執行時的處理:  註解資訊可以在程式執行的時候被提取出來加以利用

註解 @interface MyAnnotation{ }

註解的定義:

註解的定義
註解的定義是由 @interface 定義的一種類型別,是個語法糖。註解的超類都是java.lang.Annotation
註解定義的語法 註解定義的含義
@interface MyAnno1{ } 無內容的註解
@interface MyAnno2{ int value(); } 擁有單值元素的註解

@interface MyAnno3{

          int value(); 

          String name();

}

擁有多個元素的註解

@interface MyAnno4{

          int value() default 10 ;

          String name() default "anno" ;

}

擁有多個元素的註解,

某些元素可以攜帶預設值

@Retention(RetentionPolicy.RUNTIME)

@interface MyAnno5{ }

可以對自定義註解進行元注,

元註解是Java預留的,用來管控自定義註解的生態

元註解:我就簡單說它是元注,它是用來管控自定義註解的生態的。元注是java預留的,一共有5種。@Retention @Target @Documented @Inherited @Repeatable

元註解@Retention
元註解@Retention 管控自定義註解的保留期(/生命)
元註解 元註解內的元素

元註解內的元素的作用,

自定義註解的生命

@Retention RetentionPolicy.SOURCE

程式碼階段,

作用:程式碼維護人員看看而已

RetentionPolicy.CLASS

編譯階段,

作用:給其它工具/框架來使用

RetentionPolicy.RUNTIME

執行階段,

作用:程式碼執行時可以提取自定義註解內容來消費

元註解@Target

元註解@Target 管控自定義註解可以釘在哪裡

( 預設:無@Target元注的自定義註解可以釘在任何地方 )

元註解 元註解內的元素

元註解內的元素的作用,

自定義註解可以釘在哪裡

@Target ElementType.TYPE

釘在型別(類/介面/列舉)上

ElementType.FIELD 釘在類的資料成員上
ElementType.METHOD 釘在類的方法成員上
ElementType.PARAMETER 釘在方法的入參上
ElementType.LOCAL_VARIABLE 釘在方法的區域性變數上
ElementType.CONSTRUCTOR 釘在類的建構函式上
ElementType.ANNOTATION_TYPE 釘在別的註解上
ElementType.PACKAGE 釘在包上
元註解@Inherited
元註解@Inherited 管控自定義註解可以被子類繼承
元註解@Documented
元註解@Documented 管控自定義註解種的內容可以用來製作JavaDoc文件
元註解@Repeatable
元註解@Repeatable 是jdk8才引入的,以上的四個元註解中的內容元素都是單值型別的,而@Repeatable中的元素是陣列型別的,並且該元素必須是個註解

@interface Persons { //定義:容器
    Person[]  value();   //容器內的元素是陣列,陣列內的每個元素必須是註解
}

 

@Repeatable(Persons.class)  //元注:Persons容器
@interface Person{                //定義:Persons註解容器內的元素是個註解
    String role default "";
}

 

@Person(role="artist") //程式碼中宣告註解
@Person(role="coder")
@Person(role="pm")
public class SuperMan{
    //這裡可以通過反射獲取註解內容加以消費
}


註解的用法:


註解的運用場景:


註解的小示例: