![【黑馬程序員】Java中的Annotation詳解_第1頁](http://file4.renrendoc.com/view/596b93a762cc5edb3f7c7de2e9ca28dd/596b93a762cc5edb3f7c7de2e9ca28dd1.gif)
![【黑馬程序員】Java中的Annotation詳解_第2頁](http://file4.renrendoc.com/view/596b93a762cc5edb3f7c7de2e9ca28dd/596b93a762cc5edb3f7c7de2e9ca28dd2.gif)
![【黑馬程序員】Java中的Annotation詳解_第3頁](http://file4.renrendoc.com/view/596b93a762cc5edb3f7c7de2e9ca28dd/596b93a762cc5edb3f7c7de2e9ca28dd3.gif)
![【黑馬程序員】Java中的Annotation詳解_第4頁](http://file4.renrendoc.com/view/596b93a762cc5edb3f7c7de2e9ca28dd/596b93a762cc5edb3f7c7de2e9ca28dd4.gif)
![【黑馬程序員】Java中的Annotation詳解_第5頁](http://file4.renrendoc.com/view/596b93a762cc5edb3f7c7de2e9ca28dd/596b93a762cc5edb3f7c7de2e9ca28dd5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
黑馬程序員成都中心編著黑馬程序員成都中心編著傳智播客詳i高端傳智播客詳i高端it教育品牌wwwJtheima,com前言:作為Java開發(fā)人員,經(jīng)常能在代碼中看到注解(Annotation),有的是JAVA內(nèi)置的注解,或者是在使用一些三方的開源框架的代碼時(shí)候看到一些別人的自定義注解。如果你對(duì)注解不了解或者不知道如何使用,那么你在用這些三方框架的時(shí)候甚至在自己寫源碼修改源碼的時(shí)候就會(huì)變得更加的困難和舉步維艱。通過該篇文章可以基本的將注解Annotation的原理以及使用了解清楚,更加有利于你下一步比如使用Retrofit進(jìn)行網(wǎng)絡(luò)的開發(fā)打下基礎(chǔ)。1概.念官方的定義:Anannotationisaformofmetadata,thatcanbeaddedtoJavasourcecode.Classes,methods,variables,parametersandpackagesmaybeannotated.Annotationshavenodirecteffectontheoperationofthecodetheyannotate.注解Annotation是JDK5.0的新特性,是一種能夠添加到Java源代碼的語法元數(shù)據(jù)。類、方法、變量、參數(shù)、包都可以被注解,可用來將信息元數(shù)據(jù)與程序元素進(jìn)行關(guān)聯(lián)。Annotation中文常譯為“注解”。2作.用標(biāo)記,用于告訴編譯器一些信息編譯時(shí)動(dòng)態(tài)處理,如動(dòng)態(tài)生成代碼運(yùn)行時(shí)動(dòng)態(tài)處理,如得到注解信息
打包編譯后的代碼和文在構(gòu)建期程程時(shí)前打包編譯后的代碼和文在構(gòu)建期程程時(shí)前進(jìn)同源]、生成舅播客旗下「具自動(dòng)完。常用。工具xml文件,件到ww.itheimjr河硒程一高而有ant、maven。構(gòu)建工□在構(gòu)建時(shí)會(huì)自動(dòng)掃描我□的代碼,當(dāng)口到構(gòu)建期注解時(shí),會(huì)根據(jù)注解的內(nèi)容生成源碼或者其它文件3注.解的格式a)一個(gè)java注解由一個(gè)@符后面跟一個(gè)字符串「成□類似于這樣:b)java注解中一般包含一些元素,這些元素類似于屬性或者參數(shù),可以用來設(shè)置值,比如我們有一個(gè)包含兩個(gè)元素的@Entity注解:@Entity(userName="zphuan",us該注解中有兩個(gè)元素:userName,userAge,分別賦予了對(duì)應(yīng)的元素值。4注.解的位置注解可以用于描述一個(gè)類、接口、方法、方法參數(shù)、字段、局部變量等。比如:a)方法上:@OverridevoidmySuperMethod(){...}@SuppressWarnings(value="unchecked")voidmyMethod(){...}b)類上:@Author(name="zphuan",date="3/24/2017")classMyClass(){...}使用的細(xì)節(jié):.如果注解沒有參數(shù)則不用寫參數(shù)體,比如@Override.如果只有一個(gè)參數(shù)比如namedvalue,則參數(shù)名可以省略,比如:@SuppressWarnings("unchecked")voidmyMethod(){...}.也可以同時(shí)使用多個(gè)注解來標(biāo)示,比如:@Author(name="JaneDoe")@EBookclassMyClass{...}.可以重復(fù)使用注解,不過只有在javaSE8才支持。比如:
傳智播客旗下ith端IT教育品牌傳智播客旗下ith端IT教育品牌Sm@Author(name="JohnSmwww.iWeima.cornclassMyClass{...}標(biāo)明兩個(gè)作者對(duì)該類的書寫,一個(gè)管理員,一個(gè)開發(fā)者等。注意:如果想自定義一個(gè)可以用于重復(fù)使用的注解(自定義注解在后面會(huì)涉及),記得加上,比如:@Repeatable(Schedules.class)public@interfaceSchedule{StringdayOfMonth()default"first";StringdayOfWeek()default"Mon";inthour()default12;}內(nèi)置注解Java本身提供了三個(gè)內(nèi)置注解,他們分別是:?@Depreca@SuppressWarnings@Deprecated可以用來描述一個(gè)類、方法或者字段,表示java不贊成使用這些被描述的對(duì)象,如果我們使用了這些類、方法或者字段,編譯器會(huì)給我們警告。@Override注解是一個(gè)編譯時(shí)注解,它主要用在一個(gè)子類的方法中,當(dāng)被注解的子類的方法在父類中找不到與之匹配的方法時(shí),編譯器會(huì)報(bào)錯(cuò)。@SuppressWarnings注解的作用是使編譯器忽略掉編譯器警告。比如,如果我們的一個(gè)方法調(diào)用了一個(gè)@Deprecated方法,或者做了一個(gè)不安全的類型轉(zhuǎn)換,此時(shí)編譯器會(huì)生成一個(gè)警告。如果我們不想看到這些警告,我們就可以使用@SuppressWarnings注解忽略掉這些警告.6自.定義注解很多的注解在代碼上可以用來替代注釋的存在!為什么這樣說?我舉一個(gè)例子:如果你所在的一家開發(fā)軟件的it公司有這樣的要求,說你寫的每一個(gè)class類都必須有以下這些的說明:publicclassGeneration3ListextendsGeneration2List{//Author:zphuan
Date:3/17/2002守播客旗下I警輸炳忠稻育品牌//By:JaneDoe//Reviewers:Alice,Bill,Cindy//classcodegoeshere}那么可能張三使用注釋的方式,李四使用文檔注釋的方式,王五使用注解的方式,每一個(gè)人的寫法和順序可能都不一樣,甚至剛來的人還不知這個(gè)代碼上次是誰修改的,有哪些人在調(diào)用和關(guān)聯(lián)這個(gè)類,沒辦法統(tǒng)一,那么作為一個(gè)團(tuán)隊(duì)的leader你就可以在項(xiàng)目的初期創(chuàng)建一個(gè)自定義的注解Annotation來規(guī)范化所有class的申明!針對(duì)上面的這個(gè)需求,接下來我就來創(chuàng)建一個(gè)自定義的注解@interfaceClassPreamble{Stringauthor();Stringdate();intcurrentRevision()default1;StringlastModified()default"N/A";StringlastModifiedBy()default"N/A";//NoteuseofarrayString[]reviewers();}注意,?interface關(guān)鍵字就代表這是一個(gè)注解類型,所以使用?interface關(guān)鍵字就可以創(chuàng)建注解了。注解中的每個(gè)元素定義類似于接口中的方法定義。每個(gè)元素定義包含一個(gè)數(shù)據(jù)類型和名稱,注解元素的數(shù)據(jù)類型可以是java基本數(shù)據(jù)類型、String、數(shù)組,但不能是復(fù)雜對(duì)象類型。我們可以通過default關(guān)鍵字為某個(gè)元素設(shè)置默認(rèn)值,當(dāng)一個(gè)元素被設(shè)置默認(rèn)值之后,這個(gè)元素便成了注解的可選元素。那么接下來我們就可以使用注解來演示每一個(gè)類的描述了:@ClassPreamble(author="zphuan",date="3/17/2002",currentRevision=6,lastModified="4/12/2004",lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})}這樣寫就能進(jìn)行一個(gè)類的描述的規(guī)范化和統(tǒng)一了。那么可能有人會(huì)問了:這樣用注解的方式寫沒有文檔注釋方便,可以在使用該類的時(shí)候直接用看到該類的描述。在java中相信大家對(duì)?Documented這個(gè)注解非常熟悉吧?沒錯(cuò),這個(gè)注解的作用就是java用來提供給大家將你的信息注入到j(luò)ava-doc文檔中,作為api的文檔描述查看。那么我們完全可以在我們自定義的注解上使用?Documented,比如://importthistouse@Documentedimportjava.lang.annotation.作用是告訴工具,當(dāng)前注解本身也要顯示在作用是告訴工具,當(dāng)前注解本身也要顯示在中。比如上面我寫的自定義注解。??@Documented@interfaceClassPreamble{//Annotationelementdefinitions}這里的注解為什么能直接作用于我們自定義的注解?這里引入我們下面的元注解。7元.注解元注解就是用來描述注解的注解,在java中有以下幾個(gè)元注解:?@Documented
黑馬程,序員wwwJ傳智播客旗下高端IT黑馬程,序員wwwJ傳智播客旗下高端IT教育品牌用來定義當(dāng)前注解的作用范圍,有以下三個(gè)范圍可選:■注解只存在于源碼中,不會(huì)存在于文件中,在編譯時(shí)會(huì)被忽略掉■:注解只存在于文件中,在編譯期有效,但是在運(yùn)行期會(huì)被忽略掉,這也是默認(rèn)范圍■:在運(yùn)行期有效,在運(yùn)行期通過反射獲得注解信息■■■用于指定注解作用于的哪些元素,未標(biāo)注則表示可修飾所有有以下這些元素類型可供選擇:■■■ElementType.ANNOTATION_TYPEcanbeappliedtoanannotationtype.■ElementType.CONSTRUCTORcanbeappliedtoaconstructor.■ElementType.FIELDcanbeappliedtoafieldorproperty.■ElementType.LOCAL_VARIABLEcanbeappliedtoalocalvariable.
黑馬程序員ElementType.METHODcanbJ黑馬程序員ElementType.METHODcanbJ播"…appliedtoamethod-levelannotation.■ElementType.PACKAGEcanbeappliedtoapackagedeclaration.■ElementType.PARAMETERcanbeappliedtotheparametersofamethod.■ElementType.TYPEcanbeappliedtoanyelementofaclass.■通過名字就可以看出來他們的元素類型,不過有兩個(gè)需要特別說明下:元注解類型,只能用來注解其它的注解,例如■:可以用來注解任何類型的類,如類、接口、枚舉、或者注解類?!觥鯜Inherited注解表示當(dāng)前注解會(huì)被注解類的子類繼承。比如有一個(gè)自定義注解:@Inheritedpublic@interfaceInheritedAnnotation{}■如果一個(gè)類使用了上面這個(gè)注解:■@InheritedAnnotation“muaut…mfdat
傳智播客旗下=毒喘u平教育品牌"3/17/2002",currentRevision=6,lastModified="4/12/2004”,lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})publicclassGeneration3List{}?那么的子類也會(huì)繼承這個(gè)注解。?解析注解的詳細(xì)使用已經(jīng)介紹完了,那么在現(xiàn)實(shí)開發(fā)中我們一般如何使用呢?一般我們會(huì)自定義一些注解,來簡化和設(shè)計(jì)我們的代碼,然后在運(yùn)行時(shí)通過反射機(jī)制獲取到注解的信息來使用。?運(yùn)行時(shí)解析?運(yùn)行時(shí)指為的。比如下面是我自己寫的一個(gè)運(yùn)行時(shí)自定義注解:importcom.zphuan.MyAnnotation.ClassPreamble;importcom.zphuan.MyAnnotation.InheritedAnnotation;@InheritedAnnotation@ClassPreamble(author="zphuan",date="3/17/2002",currentRevision=6,lastModified="4/12/2004",lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})publicclassGeneration3List{
}1行起來的時(shí)候我想要獲取到Generation3List中的快,ClassPreamble注解中的信息:author,date,currentReviSion。實(shí)現(xiàn)的方式如下:importcom.zphuan.MyAnnotation.ClassPreamble;publicclassMain{publicstaticvoidmain(String[]args){//□□□□□□Generation3List□□□□□ClassPreamblepreamble=(ClassPreamble)Generation3List.class.getAnnotation(ClassPreamble.class);System.out.println("preambleauthor:"+preamble.author());System.out.println("preamblecurrentRevision:"+preamble.currentRevision());System.out.println("preambledate:"+preamble.date());}}打印的結(jié)果為:packagecan.zphuan;■.importcar.zphuan.MyAnnotation.CLassPrecmble;4publicclassMain(publicstaticvoidmainfStringCargs^{〃通過反射獲羯(5斷電ration3Li就的注第信息fiClassPreamblepreamble=(ClassPrearble)GeneratiQri3List.classrgetAnnotationfClassPrecrnble*deSystem.out.printlnC'preanbleauthor:,r+precFrtile.authorQ^;10Systen.out.printlnC'preamblecurreritRevision:"+preanibIe.currentRevisionC)i;1LSystembturtnprintlnt^prfttnbledate:<k-^reait>le-datet));12)再舉個(gè)獲取方法注解信息的例子。我定義了一個(gè)用于方法上的運(yùn)行時(shí)注解:@Retention(RetentionPolicy.RUNTIME);二;,.!@Target(value={ElementType.METHOD}),急y二二:「蓼'二//節(jié)曲lic/螂nterfce/MethodAnno憎tion{"點(diǎn)的蛙匹典曲出配處也里也型娶照日preooibLeautrior:zphu£inP「/m/1/c/r/en/RiString/author。;p「t?cnblt?mte:3/1冊幽電gcate();該注解作用與下面這個(gè)類中的test方法上:publicclassGeneration3List{@MethodAnnotation(author="zphuan",date="3/26/2017")publicvoidtest(){}}現(xiàn)在我想要獲取到該方法上的注解信息,可以這樣反射獲取:try{
?WHS!傳智播客旗下fc麟?WHS!傳智播客旗下fc麟hu用北rat鉗Listet榭需ds()){if(methodAnnotation!=null){System.out.println("author:"+methodAnnotation.author());System.out.println("date:"+methodAnnotation.date());}}catch(ClassNotFoundExceptione){e.printStackTrace();}最后得到的結(jié)果為:164171814202122四24164171814202122四2425Z6以7當(dāng)然獲取其他比如三個(gè)方法的作用即可:forCMethodmethod:clazz.getMetliodsQ){MethodAnnotatiQnmethodAnnotqtion-method,getAjinotationtMethodAnnotation+1ifCmethodAnnotation!=null”System.out.println('author:M+methodAnnotation.outhor());System.out.println(Hdate:"+methodAnnotation+dcite());))catch(ClassNotFoundExceptione){e.printStackTraceO;Field,PARAMETER等信息也是通過該反射獲取即可,主要記住以下4Console£3<tenriiiiiatecJ>M^in(11authoAnnnoodote3/26/2017則表示得到該所有表示該是否被某個(gè)“福信0n因?yàn)橐粋€(gè)加~可以被多個(gè)'no4Console£3<tenriiiiiatecJ>M^in(11authoAnnnoodote3/26/2017則表示得到該所有表示該是否被某個(gè)修飾解析2編譯時(shí)(1)編譯時(shí)Annotation指?Retention為CLASS的Annotation,1編譯器自動(dòng)解析。解析需要做的a.自定義類集成自AbstractProcessorb.重寫其中的process函數(shù)⑵創(chuàng)建一個(gè)注解類型為CLASS的Annotation,如下:@Retention(RetentionPolicy.CLASS)public@interfaceClassAnnotation{Stringauthor();}(3)作用于Generation3List@ClassAnnotation(author="zphuan")publicclassGeneration3List{@MethodAnnotation(author="zphuan",date="3/26/2017")publicvoidtest(){}}(4)編譯時(shí)解析:importjava.util.HashMap;importjava.util.Set;cessing.AbstractProcessor;cessing.RoundEnvironment;cessing.SupportedAnnotationTypes;importjavax.lang.model.element.Element;importjavax.lang.model.element.TypeElement;importcom.zphuan.MyAnnotation.ClassAnnotation;@SupportedAnnotationTypes({"com.zphuan.MyAnnotation.ClassAnnotation"})publicclassClassProcessorextendsAbstractProcessor{privatestaticHashMap<String,String>map;@Overridepublicbooleanprocess(Set<?extendsTypeElement>annotations,RoundEnvi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度廠地租賃合同附租賃場地臨時(shí)占用許可協(xié)議
- 2025年度物流車輛運(yùn)輸與倉儲(chǔ)管理合同樣本
- 2025年度城市軌道交通施工總承包合同(2024版)
- 2025年度建筑材料檢測與認(rèn)證服務(wù)合同
- 2025年度博物館藏品清潔保護(hù)合同
- 2025年初級(jí)農(nóng)產(chǎn)品種植基地建設(shè)與產(chǎn)品銷售合同
- 2025年度市政道路照明系統(tǒng)安裝施工合同范例
- 2025年度XX人力資源公司高效派遣及管理服務(wù)合同
- 乘除法練習(xí)題1000道讓你更自信面對(duì)挑戰(zhàn)
- 護(hù)理行業(yè)創(chuàng)業(yè)方案
- 城市綠化與生態(tài)環(huán)境改善
- 2024-2025學(xué)年中小學(xué)校第二學(xué)期師德師風(fēng)工作計(jì)劃:必看!新學(xué)期師德師風(fēng)建設(shè)秘籍大公開(附2月-7月工作安排表)
- 《急性心力衰竭的急救處理》課件
- 小學(xué)六年級(jí)數(shù)學(xué)上冊《簡便計(jì)算》練習(xí)題(310題-附答案)
- 青海省西寧市海湖中學(xué)2025屆中考生物仿真試卷含解析
- 2024年河南省《輔警招聘考試必刷500題》考試題庫及答案【全優(yōu)】
- -情景交際-中考英語復(fù)習(xí)考點(diǎn)
- 安全隱患報(bào)告和舉報(bào)獎(jiǎng)勵(lì)制度
- 地理標(biāo)志培訓(xùn)課件
- 2025年高壓電工作業(yè)考試國家總局題庫及答案(共280題)
- 2023行政主管年終工作報(bào)告五篇
評(píng)論
0/150
提交評(píng)論