Java註解介紹javascript
Annotation
、ElementType
、RetentionPolicy
這三個類是註解中最重要的類,沒有這三個類就沒有註解,其中Annotation
是接口,其他兩個是枚舉。
全部的註解都基於這三個類,所謂的元註解也是用這三個類生成的,只不過可修飾的元素(ElementType)爲ANNOTATION_TYPE罷了,你也能夠寫個元註解。html
1. Annotationjava
package java.lang.annotation; //java.lang.annotation包下
public interface Annotation {
boolean equals(Object var1);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}複製代碼
2. ElementTypeapi
package java.lang.annotation; //java.lang.annotation包下
public enum ElementType {
TYPE, // 類、接口(包括註釋類型)或枚舉聲明
FIELD, // 字段聲明(包括枚舉常量)
METHOD, //方法聲明
PARAMETER, //參數聲明
CONSTRUCTOR, //構造方法聲明
LOCAL_VARIABLE, //局部變量聲明
ANNOTATION_TYPE, //註解類型聲明
PACKAGE, //包聲明
TYPE_PARAMETER, //類型參數聲明(1.8新加入),表示這個註解能夠用來標註類型參數
TYPE_USE; //類型使用聲明(1.8新加入),用於標註各類類型,只要是類型名稱,均可以進行註解
private ElementType() {
}
}複製代碼
3. RetentionPolicy數組
package java.lang.annotation;//java.lang.annotation包下
public enum RetentionPolicy {
SOURCE, //註解將被編譯器丟棄;Annotation信息僅存在於編譯器處理期間,編譯器處理完以後就沒有該Annotation信息了
CLASS, //註解在class文件中可用,但會被VM丟棄
RUNTIME; //VM將在運行期也保留註解信息,所以能夠經過反射機制讀取註解的信息
private RetentionPolicy() {
}
}複製代碼
Java提供了四種元註解(meta-annotation),元註解就是專職負責註解其餘的註解,因此這四種註解的Target值都是ElementType.ANNOTATION_TYPE框架
1. @Target
表示該註解能夠用在什麼地方,由ElementType枚舉定義ide
@Documented
@Retention(RetentionPolicy.RUNTIME) //被VM識別
@Target({ElementType.ANNOTATION_TYPE}) //修飾註解類型
public @interface Target {
ElementType[] value(); //當使用此註解時,無默認註解,必需要傳入ElementType
}複製代碼
2. @Retention
表示須要在什麼級別保存該註解信息,由RetentionPolicy枚舉定義學習
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
RetentionPolicy value(); // 必需要傳入
}複製代碼
3. @Documented
表示註解會被包含在javaapi文檔中ui
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}複製代碼
4. @Inherited
容許子類繼承父類的註解,即它所標註的Annotation將具備繼承性spa
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}複製代碼
//@Target(ElementType.Method)
//@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
int id(); // default 1; 不添加default值使用該註解時必需要傳入傳入
String value() default ""; //若是隻有value()這一個屬性須要賦值的話,能夠省略鍵值對傳值
// Integer id() default 1; //拋出異常,Invalid type
}複製代碼
@interface表示該類是一個註解,並實現了Annotation接口
。
@Target表示該註解能夠修飾的類型;若是不填,則此註解可使用任何元素之上;
@Retention用來定義註解在哪個級別可用,是源碼中可見、編譯器可見仍是VM可見;若是不填,默認級別是CLASS。
註解元素可用的類型
全部基本類型(int,float,boolean,byte,double,char,long,short)、 String、Class、enum、Annotation和以上類型的數組;其它的值都會拋出Error: 註釋值不是容許的類型
。
註解的快捷方式
當註解內元素方法名爲value()時,而且該元素是惟一一個須要賦值的值(另外的值有默認值),能夠不用使用鍵值對來傳值,直接使用@MyAnnotation("2")
傳值;若是有兩個,則要使用@MyAnnotation(id=1,value = "2")
來傳值。
其中根據註解參數的個數,咱們能夠將註解分爲:標記註解、單值註解、完整註解三類。
1. @Deprecated
標記註解,所標註內容,再也不被建議使用。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Deprecated {
}複製代碼
2. @Override
標記註解,只能標註方法,表示該方法覆蓋父類中的方法。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}複製代碼
3. @SuppressWarnings
所標註內容產生的警告,編譯器會對這些警告保持靜默。
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
/* value可取的值: deprecation -- 使用了不同意使用的類或方法時的警告 unchecked -- 執行了未檢查的轉換時的警告,例如當使用集合時沒有用泛型 (Generics) 來指定集合保存的類型。 fallthrough -- 當 Switch 程序塊直接通往下一種狀況而沒有 Break 時的警告。 path -- 在類路徑、源文件路徑等中有不存在的路徑時的警告。 serial -- 當在可序列化的類上缺乏 serialVersionUID 定義時的警告。 finally -- 任何 finally 子句不能正常完成時的警告。 all -- 關於以上全部狀況的警告。 */複製代碼
Java處理註解有兩種方式:
使用apt來在編譯時期生成相應的代碼,經過註解處理器(AnnotationProcessor)來處理
在運行時經過反射獲取註解信息來處理
這塊以後專門來學習,這篇文章不贅述了。
生成文檔。這是最多見的,也是java 最先提供的註解。經常使用的有@see @param @return 等
代碼分析,跟蹤代碼依賴性。如JUnit框架的註解使用。
在編譯時進行格式檢查。如@override 放在方法前,若是你這個方法並非覆蓋了超類方法,則編譯時就能檢查出。
本篇文章介紹註解的基本概念和做用,對註解的基本有個清晰的瞭解,以後再單獨寫對註解的處理,ButterKnife是個很好的學習例子。
參考:
Java Annotation認知(包括框架圖、詳細介紹、示例說明)
Java註解全面解析
Java深度歷險(六)——Java註解