阿里P6來講解一下Java 註解介紹
一. 註解中最重要的三個類
Annotation 、 ElementType 、 RetentionPolicy 這三個類是註解中最重要的類, 沒有這三個類就沒有註解 ,其中 Annotation 是介面,其餘兩個是列舉。
所有的註解都基於這三個類,所謂的 元註解 也是用這三個類生成的,只不過可修飾的元素(ElementType)為ANNOTATION_TYPE罷了,你也可以寫個元註解。
1. Annotation
package java.lang.annotation; //java.lang.annotation包下 public interface Annotation { boolean equals(Object var1); int hashCode(); String toString(); Class<? extends Annotation> annotationType(); }
2. ElementType
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列舉定義
@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文件中
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}
4. @Inherited
允許子類繼承父類的註解,即它所標註的Annotation將具有繼承性
@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
}
[email protected]表示該類是一個註解,並實現了 Annotation介面 。
[email protected]表示該註解可以修飾的型別;如果不填,則此註解可以使用任何元素之上;
[email protected]用來定義註解在哪一個級別可用,是原始碼中可見、編譯器可見還是VM可見;如果不填,預設級別是CLASS。
4.註解元素可用的型別:所有基本型別(int,float,boolean,byte,double,char,long,short)、 String、Class、enum、Annotation和以上型別的陣列;其它的值都會丟擲 Error: 註釋值不是允許的型別 。
5.註解的快捷方式:當註解內元素方法名為value()時, 並且該元素是唯一一個需要賦值的值 (另外的值有預設值),可以不用使用鍵值對來傳值,直接使用 @MyAnnotation(“2”) 傳值;如果有兩個,則要使用 @MyAnnotation(id=1,value = “2”) 來傳值。
四. Java常用的註解
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 放在方法前,如果你這個方法並不是覆蓋了超類方法,則編譯時就能檢查出。
如果你剛好是程式設計師,如果你剛好又是Java程式設計師,如果剛好你的技術又遇到了瓶頸但是你又拒絕平庸,期待蛻變,想進入一線網際網路公司或者給自己漲薪
我這裡剛好有一套自己儲存的Java進階學習資料。包含了Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫
之前的兩千人群滿了 這個是新群Java高階進階群:963944895,免費傳送的喲
結語
本篇文章介紹註解的基本概念和作用,對註解的基本有個清晰的瞭解,之後再單獨寫對註解的處理。