概述
注解想必大家在項目中經常使用,比如Spring框架中常用的一些注解:@Controller
、@Service
、@RequestMapping
等等,它是JDK1.5及以后版本引入的一個特性。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。那么你知道JDK什么是元注解嗎?注解有哪些分類嗎?以及注解在Java中最本質究竟是什么東西,是如何實現的呢?
注解的分類
根據注解的使用場景,主要分為三類,元注解、內置注解和自定義注解。
元注解
用于定義注解的注解,通常用于注解的定義上,標明該注解的使用范圍、生效范圍等。簡而言之,元注解是用來修飾注解的。
@Retention
指定注解信息保留到哪個階段,分別為源代碼階段、編譯Class階段、運行階段。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
- SOURCE: 保留在源代碼java中,被編譯器丟棄,也就是說在class文件中不包含注解信息,通常用來標記源碼,引起大家的注意,比如自定義一個注解例如@ThreadSafe,用來標識一個類時線程安全的。
- CLASS: 編譯后的class文件中包含注解信息,但是會被jvm丟棄
- RUNTIME: 注解信息在運行期(JVM)保留(.class也有),可以通過反射機制讀取注解的信息
@Target
指定注解的使用范圍,如類、方法、屬性、局部屬性、參數等, 可以多選。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
具體可選的枚舉如下:
public enum ElementType {
/** 適用范圍:類、接口、注解類型,枚舉類型enum */
TYPE,
/** 作用于類屬性 (includes enum constants) */
FIELD,
/** 作用于方法 */
METHOD,
/** 作用于參數聲明 */
PARAMETER,
/** 作用于構造函數聲明 */
CONSTRUCTOR,
/** 作用于局部變量聲明 */
LOCAL_VARIABLE,
/** 作用于注解聲明 */
ANNOTATION_TYPE,
/** 作用于包聲明 */
PACKAGE,
/** 作用于類型參數(泛型參數)聲明 */
TYPE_PARAMETER,
/** 作用于使用類型的任意語句(不包括class) */
TYPE_USE
}
@Inherited
加上該注解的注解,表示可以被標注的類子類繼承,比如A上標記了帶有@Inherited
的注解,那么類B繼承了A, 那么B也會有這個注解,默認情況下注解是不支持繼承的。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
@Document
將此注解包含在 javadoc 中 ,它代表著此注解會被javadoc工具提取成文檔。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Repeatable
1.8中加入的元注解,用來標記是否可以重復標記。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
/**
* Indicates the containing annotation type for the
* repeatable annotation type.
* @return the containing annotation type
*/
Class? extends Annotation value();
}
內置注解
java提供了一些內置注解,可以配合編譯器來檢查代碼的正確性, 我們可以關注他們的元注解。
@Override
標記當前方法是覆寫父類的方法。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Deprecated
標記一個元素為已過期,不要在使用了
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
@SuppressWarnings
用來關閉編譯器輸出的警告信息
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
@FunctionalInterface
java8中引入,標記是一個函數式接口,也就是說有且只有一個抽象方法的接口
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
自定義注解
注解遵循的格式一般如下:
//元注解部分 xxxx
@Retention(xxxx)
@Target(xxxx)
public @interface 注解名 {
返回值 屬性名() 默認值;
返回值 屬性名() 默認值;
}
- 返回值支持的類型如下:java的8種基礎類型(不支持包裝類型)、String、Class、Enum、Annotation、以及上面類型的數組。
- 默認值可選,非必有。
舉個項目中自定義的栗子:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataAuthorize {
/**
* 資產ID
* @return
*/
String assetId();
/**
* 資產類型
* @return
*/
String assetType();
/**
* 權限代碼
* @return
*/
String authCode() default "";
/**
* 使用的類型
* @return
*/
Class[] useType();
}
-
JAVA
+關注
關注
19文章
2973瀏覽量
104901 -
JDK
+關注
關注
0文章
81瀏覽量
16604 -
spring框架
+關注
關注
0文章
7瀏覽量
2053
發布評論請先 登錄
相關推薦
評論