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

Java中注解的作用

如何通過(guò)注解來(lái)優(yōu)化我們的Java代碼
詳細(xì)介紹了Java泛型、注解、并發(fā)編程
HarmonyOS注解的使用方法分享
分析java注解基本概念
Spring Boot常用注解與使用方式
注解定義Bean及開(kāi)發(fā)
JAVA中注解是怎么做到的(下)

怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?(上)

評(píng)論