1、注解的作用或者意義是什么?
注解本身沒(méi)有任何意義,單獨(dú)的注解就是一種注釋?zhuān)枰Y(jié)合其他如反射、插樁等技術(shù)才有意義。
Java 注解(Annotation)又稱(chēng) Java 標(biāo)注,是 JDK1.5 引入的一種注釋機(jī)制。是元數(shù)據(jù)的一種形式,提供有關(guān)于程序但不屬于程序本身的數(shù)據(jù)。注解對(duì)它們注解的代碼的操作沒(méi)有直接影響。
2、元注解
在定義注解時(shí),注解類(lèi)也能夠使用其他的注解聲明。對(duì)注解類(lèi)型進(jìn)行注解的注解類(lèi),我們稱(chēng)之為 meta-annotation(元注解)。聲明的注解允許作用于哪些節(jié)點(diǎn)使用@Target聲明;保留級(jí)別由@Retention 聲明。其中保留級(jí)別如下。
RetentionPolicy.SOURCE
標(biāo)記的注解僅保留在源級(jí)別中,并被編譯器忽略。
RetentionPolicy.CLASS
標(biāo)記的注解在編譯時(shí)由編譯器保留,但 Java 虛擬機(jī)(JVM)會(huì)忽略。
RetentionPolicy.RUNTIME
標(biāo)記的注解由 JVM 保留,因此運(yùn)行時(shí)環(huán)境可以使用它。
SOURCE < CLASS < RUNTIME,即CLASS包含了SOURCE,RUNTIME包含SOURCE、CLASS。
根據(jù)注解的保留級(jí)別不同,對(duì)注解的使用自然存在不同場(chǎng)景
3、Android注解語(yǔ)法檢查
在Android中我們需要設(shè)計(jì)接口以供使用者調(diào)用時(shí),如出現(xiàn)需要對(duì)入?yún)⑦M(jìn)行類(lèi)型限定,如限定為資源ID、布局ID等類(lèi)型參數(shù),將參數(shù)類(lèi)型直接給定int即可。然而,我們可以利用Android為我們提供的語(yǔ)法檢查注解,來(lái)輔助進(jìn)行更為直接的參數(shù)類(lèi)型檢查與提示。
參數(shù)限制為:圖片資源ID。
同時(shí),我們也可以通過(guò)利用@Intdef來(lái)定義自己的入?yún)㈩?lèi)型檢查。
4、反射
一般情況下,我們使用某個(gè)類(lèi)時(shí)必定知道它是什么類(lèi),是用來(lái)做什么的,并且能夠獲得此類(lèi)的引用。于是我們直接對(duì)這個(gè)類(lèi)進(jìn)行實(shí)例化,之后使用這個(gè)類(lèi)對(duì)象進(jìn)行操作。
反射則是一開(kāi)始并不知道我要初始化的類(lèi)對(duì)象是什么,自然也無(wú)法使用 new 關(guān)鍵字來(lái)創(chuàng)建對(duì)象了。這時(shí)候,我們使用 JDK 提供的反射 API 進(jìn)行反射調(diào)用。反射就是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;并且能改變它的屬性。是Java被視為動(dòng)態(tài)語(yǔ)言的關(guān)鍵。
5、Type
A、TypeVariable
? 泛型類(lèi)型變量。可以泛型上下限等信息;
B、ParameterizedType
? 具體的泛型類(lèi)型,可以獲得元數(shù)據(jù)中泛型簽名類(lèi)型(泛型真實(shí)類(lèi)型)
C、GenericArrayType
? 當(dāng)需要描述的類(lèi)型是泛型類(lèi)的數(shù)組時(shí),比如List[],Map[],此接口會(huì)作為T(mén)ype的實(shí)現(xiàn)。
WildcardType
? D、通配符泛型,獲得上下限信息;