一,基本概念
Java注解是JDK5.0引入的注釋機(jī)制,可以被使用在類,方法,參數(shù)等地方中,并且可以通過(guò)Java的反射機(jī)制獲取注解中的內(nèi)容,
注解相當(dāng)于標(biāo)簽,可以標(biāo)識(shí)方法,類或?qū)傩跃哂心承┨卣鳎诰幾g器生成的類文件時(shí),可以被嵌入到字節(jié)碼中。另外用戶可以自
定義注解,完成定制化的開(kāi)發(fā),尤其是在利用springboot進(jìn)行項(xiàng)目開(kāi)發(fā)時(shí),我們會(huì)經(jīng)常使用注解管理spring容器的bean,從而大大
提高了開(kāi)發(fā)的效率。
二,常用注解
在開(kāi)發(fā)過(guò)程中,我們可以經(jīng)??吹揭恍﹥?nèi)置的注解:
Override:用于校驗(yàn)該方法是否是重載方法,如果不是重載方法,而且還是使用這個(gè)注解則會(huì)報(bào)錯(cuò)。
Deprecated:用于過(guò)時(shí)的用法,如果繼續(xù)使用,編譯器會(huì)給出警告
SuppressWarnings:用于指示編譯器忽略注解中聲明的警告
在編寫(xiě)自定義注解時(shí),也會(huì)使用一些元注解:
1, Retention:定義了注解的保留策略(RetentionPolicy)
@documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public?@interface?Retention?{????????RetentionPolicy?value();}
其中RetentionPolicy是一個(gè)枚舉類型,共有三種枚舉值
(1)CLASS:此注解的缺省行為,表明在程序運(yùn)行期間,注解可以被編譯器保存在類文件中,但不會(huì)被虛擬機(jī)保留。
(2)RUNTIME:表明在程序運(yùn)行期間,既可以被編譯器保存在類文件中,也被虛擬機(jī)保留,所以注解的內(nèi)容可以通過(guò)反射機(jī)制讀取
(3)SOURCE:注解會(huì)被編譯器丟棄
2, Target:定義了注解的作用目標(biāo)
@documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public?@interface?Target?{????????ElementType[]?value();}
其中ElementType是一個(gè)枚舉類型,并且表明 Target注解擁有的是枚舉類型的數(shù)組,可以被指定多個(gè)值。
(1)TYPE:允許作用在類,接口或者枚舉聲明上
(2)FIELD:允許作用在屬性字段上
(3)METHOD:允許作用在方法上
(4)PARAMETER:允許作用在參數(shù)上
(5)CONSTRUCTOR:允許作用在構(gòu)造器上
(6)LOCAL_VARIABLE:允許作用在本地變量上
(7)ANNOTATION_TYPE:允許作用在注解類型上
(8)PACKAGE:允許作用在包上
JDK1.8之后,新增TYPE_PARAMETER和TYPE_USE兩個(gè)屬性
(9)TYPE_PARAMETER:允許作用在類型參數(shù)上
(10)TYPE_USE:允許作用在使用類型的地方上
3, documented定義注解可以包含在javadoc中
4, Inherited:表明注解可以被子類集成使用
三,自定義注解
1,使用關(guān)鍵字 interface進(jìn)行自定義注解,注解內(nèi)容可以指定注解屬性的類型,缺省值等
@documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,?ElementType.FIELD})public?@interface?MyAnnotation?{????int?id()?default?0;????String[]?value();}
自定義的注解MyAnnotation包含id和value兩個(gè)屬性,其中屬性id的類型為int,且缺省值為0,屬性value的類型為String數(shù)組。
注意,在聲明屬性時(shí),屬性名后跟的小括號(hào)一定要加上。 MyAnnotation表明可以被使用在方法或?qū)傩宰侄紊?,并且被編譯器保存在類文件中,
一直駐留在JVM虛擬機(jī)中,所以可以通過(guò)反射訪問(wèn)到注解中的內(nèi)容。
2,使用方法
public?class?User?{???@MyAnnotation(value?=?{"male",?"female"})????public?void?getUser(String?name,?int?age)?{????????System.out.println("user:?["?+?name?+?","?+?age?+?"]");????}}
@MyAnnotation被使用在getUser方法上,并且指定注解的vlue屬性值為male和female
3,利用反射獲取注解
public?class?MyAnnotationTest?{????public?static?void?main(String[]?args)?throws?Exception?{????????User?user?=?new?User();????????//通過(guò)返回獲取實(shí)例????????Class?userClass?=?User.class;????????Method?method?=?userClass.getMethod("getUser",?String.class,?int.class);????????//利用反射調(diào)用方法????????method.invoke(user,?"Rose",?24);????????//獲取方法上的MyAnnotation注解????????if?(method.isAnnotationPresent(MyAnnotation.class))?{????????????//獲取方法上的注解實(shí)例????????????MyAnnotation?annotation?=?method.getAnnotation(MyAnnotation.class);????????????String[]?value?=?annotation.value();????????????for?(String?v?:?value)?{????????????????System.out.printf("%s?",?v);????????????}????????}?else?{????????????System.out.println("沒(méi)有應(yīng)用MyAnnotation注解");????????}????????System.out.println();????????//獲取方法上的所有注解????????Annotation[]?annotations?=?method.getAnnotations();????????for?(Annotation?annotation?:?annotations)?{????????????System.out.println(annotation);???????}????}}
利用Java的反射機(jī)制獲取方法上的注解內(nèi)容,通過(guò)Method類的getAnnotation方法可以獲取到指定的注解,getAnnotations方法可以獲取到方法上的所用注解。
運(yùn)行結(jié)果:
四,小結(jié)
注解相當(dāng)于標(biāo)簽,利用反射機(jī)制可以獲取到注解中的內(nèi)容,可以作用在類,方法,參數(shù)等地方,使其具有某些屬性,通過(guò)注解對(duì)程序進(jìn)行標(biāo)識(shí)來(lái)實(shí)現(xiàn)特定的處理,讓編寫(xiě)的程序更加簡(jiǎn)潔。
Java技術(shù)內(nèi)容
Java8新特性注解:http://www.bjpowernode.com/javafeatures/1126.html
什么是Java注解:http://www.bjpowernode.com/tutorial_java_advance/1055.html
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“初學(xué)者學(xué)編程Java注解的使用”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。