久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

開發(fā)必學(xué):Java 注解全面解析

 白色楓車JAYCN 2016-06-14

1基本語(yǔ)法

注解定義看起來(lái)很像接口的定義。事實(shí)上,與其他任何接口一樣,,注解也將會(huì)編譯成class文件,。

除了@符號(hào)以外,@Test的定義很像一個(gè)空的接口,。定義注解時(shí),,需要一些元注解(meta-annotation),如@Target和@Retention
@Target用來(lái)定義注解將應(yīng)用于什么地方(如一個(gè)方法或者一個(gè)域)
@Retention用來(lái)定義注解在哪一個(gè)級(jí)別可用,,在源代碼中(source),,類文件中(class)或者運(yùn)行時(shí)(runtime)
在注解中,一般都會(huì)包含一些元素以表示某些值,。當(dāng)分析處理注解時(shí),,程序可以利用這些值。沒有元素的注解稱為標(biāo)記注解(marker annotation)
四種元注解,,元注解專職負(fù)責(zé)注解其他的注解,,所以這四種注解的Target值都是ElementType.ANNOTATION_TYPE

注解說(shuō)明
@Target表示該注解可以用在什么地方,由ElementType枚舉定義
CONSTRUCTOR:構(gòu)造器的聲明
FIELD:域聲明(包括enum實(shí)例)
LOCAL_VARIABLE:局部變量聲明
METHOD:方法聲明
PACKAGE:包聲明
PARAMETER:參數(shù)聲明
TYPE:類,、接口(包括注解類型)或enum聲明
ANNOTATION_TYPE:注解聲明(應(yīng)用于另一個(gè)注解上)
TYPE_PARAMETER:類型參數(shù)聲明(1.8新加入)
TYPE_USE:類型使用聲明(1.8新加入)
PS:當(dāng)注解未指定Target值時(shí),,此注解可以使用任何元素之上,就是上面的類型
@Retention表示需要在什么級(jí)別保存該注解信息,,由RetentionPolicy枚舉定義
SOURCE:注解將被編譯器丟棄(該類型的注解信息只會(huì)保留在源碼里,,源碼經(jīng)過(guò)編譯后,注解信息會(huì)被丟棄,,不會(huì)保留在編譯好的class文件里)
CLASS:注解在class文件中可用,,但會(huì)被VM丟棄(該類型的注解信息會(huì)保留在源碼里和class文件里,在執(zhí)行的時(shí)候,,不會(huì)加載到虛擬機(jī)(JVM)中)
RUNTIME:VM將在運(yùn)行期也保留注解信息,因此可以通過(guò)反射機(jī)制讀取注解的信息(源碼,、class文件和執(zhí)行的時(shí)候都有注解的信息)
PS:當(dāng)注解未定義Retention值時(shí),,默認(rèn)值是CLASS
@Documented表示注解會(huì)被包含在javaapi文檔中
@Inherited允許子類繼承父類的注解

2注解元素


– 注解元素可用的類型如下:

– 所有基本類型(int,float,boolean,byte,double,char,long,short)
– String
– Class
– enum
– Annotation
– 以上類型的數(shù)組
如果使用了其他類型,那編譯器就會(huì)報(bào)錯(cuò),。也不允許使用任何包裝類型,。注解也可以作為元素的類型,也就是注解可以嵌套,。
元素的修飾符,,只能用public或default。

– 默認(rèn)值限制
編譯器對(duì)元素的默認(rèn)值有些過(guò)分挑剔,。首先,,元素不能有不確定的值。也就是說(shuō),元素必須要么具有默認(rèn)值,,要么在使用注解時(shí)提供元素的值,。
其次,對(duì)于非基本類型的元素,,無(wú)論是在源代碼中聲明,,還是在注解接口中定義默認(rèn)值,都不能以null作為值,。這就是限制,,這就造成處理器很難表現(xiàn)一個(gè)元素的存在或缺失狀態(tài),因?yàn)槊總€(gè)注解的聲明中,,所有的元素都存在,,并且都具有相應(yīng)的值。為了繞開這個(gè)限制,,只能定義一些特殊的值,,例如空字符串或負(fù)數(shù),表示某個(gè)元素不存在,。

3快捷方式


何為快捷方式呢,?先來(lái)看下springMVC中的Controller注解

可以看見Target應(yīng)用于類、接口,、注解和枚舉上,,Retention策略為RUNTIME運(yùn)行時(shí)期,有一個(gè)String類型的value元素,。平常使用的時(shí)候基本都是這樣的:

這就是快捷方式,,省略了名-值對(duì)的這種語(yǔ)法。下面給出詳細(xì)解釋:
注解中定義了名為value的元素,,并且在應(yīng)用該注解的時(shí)候,,如果該元素是唯一需要賦值的一個(gè)元素,那么此時(shí)無(wú)需使用名-值對(duì)的這種語(yǔ)法,,而只需在括號(hào)內(nèi)給出value元素所需的值即可,。這可以應(yīng)用于任何合法類型的元素,當(dāng)然了,,這限制了元素名必須為value,。




4JDK1.8注解增強(qiáng)



TYPE_PARAMETER和TYPE_USE

在JDK1.8中ElementType多了兩個(gè)枚舉成員,TYPE_PARAMETER和TYPE_USE,,他們都是用來(lái)限定哪個(gè)類型可以進(jìn)行注解,。舉例來(lái)說(shuō),如果想要對(duì)泛型的類型參數(shù)進(jìn)行注解:


那么,,在定義@TestTypeParam時(shí),,必須在@Target設(shè)置ElementType.TYPE_PARAMETER,,表示這個(gè)注解可以用來(lái)標(biāo)注類型參數(shù)。例如:

ElementType.TYPE_USE用于標(biāo)注各種類型,,因此上面的例子也可以將TYPE_PARAMETER改為TYPE_USE,,一個(gè)注解被設(shè)置為TYPE_USE,只要是類型名稱,,都可以進(jìn)行注解,。例如有如下注解定義:


那么以下的使用注解都是可以的:

PS:以上@Test注解都是在類型的右邊,要注意區(qū)分1.8之前的枚舉成員,,例如:


在上面這個(gè)例子中,,顯然是在進(jìn)行text變量標(biāo)注,所以還使用當(dāng)前的@Target會(huì)編譯錯(cuò)誤,,應(yīng)該加上ElementType.LOCAL_VARIABLE,。

@Repeatable注解

@Repeatable注解是JDK1.8新加入的,從名字意思就可以大概猜出他的意思(可重復(fù)的),??梢栽谕粋€(gè)位置重復(fù)相同的注解。舉例:


如下進(jìn)行注解使用:


換一種風(fēng)格:


在JDK1.8還沒出現(xiàn)之前,,沒有辦法到達(dá)這種“風(fēng)格”,,使用1.8,可以如下定義@Filter:


實(shí)際上這是編譯器的優(yōu)化,,使用@Repeatable時(shí)告訴編譯器,,使用@Filters來(lái)作為收集重復(fù)注解的容器,而每個(gè)@Filter存儲(chǔ)各自指定的字符串值,。

JDK1.8在AnnotatedElement接口新增了getDeclaredAnnotationsByType和getAnnotationsByType,,在指定@Repeatable的注解時(shí),會(huì)尋找重復(fù)注解的容器中,。相對(duì)于,,getDeclaredAnnotation和getAnnotation就不會(huì)處理@Repeatable注解。舉例如下:


日志如下:

來(lái)源:http://www./article/java-annotation-learn.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多