【黑馬程序員】Java中的Annotation詳解_第1頁
【黑馬程序員】Java中的Annotation詳解_第2頁
【黑馬程序員】Java中的Annotation詳解_第3頁
【黑馬程序員】Java中的Annotation詳解_第4頁
【黑馬程序員】Java中的Annotation詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

黑馬程序員成都中心編著黑馬程序員成都中心編著傳智播客詳i高端傳智播客詳i高端it教育品牌wwwJtheima,com前言:作為Java開發(fā)人員,經(jīng)常能在代碼中看到注解(Annotation),有的是JAVA內(nèi)置的注解,或者是在使用一些三方的開源框架的代碼時候看到一些別人的自定義注解。如果你對注解不了解或者不知道如何使用,那么你在用這些三方框架的時候甚至在自己寫源碼修改源碼的時候就會變得更加的困難和舉步維艱。通過該篇文章可以基本的將注解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)記,用于告訴編譯器一些信息編譯時動態(tài)處理,如動態(tài)生成代碼運行時動態(tài)處理,如得到注解信息

打包編譯后的代碼和文在構(gòu)建期程程時前打包編譯后的代碼和文在構(gòu)建期程程時前進(jìn)同源]、生成舅播客旗下「具自動完。常用。工具xml文件,件到ww.itheimjr河硒程一高而有ant、maven。構(gòu)建工□在構(gòu)建時會自動掃描我□的代碼,當(dāng)口到構(gòu)建期注解時,會根據(jù)注解的內(nèi)容生成源碼或者其它文件3注.解的格式a)一個java注解由一個@符后面跟一個字符串「成□類似于這樣:b)java注解中一般包含一些元素,這些元素類似于屬性或者參數(shù),可以用來設(shè)置值,比如我們有一個包含兩個元素的@Entity注解:@Entity(userName="zphuan",us該注解中有兩個元素:userName,userAge,分別賦予了對應(yīng)的元素值。4注.解的位置注解可以用于描述一個類、接口、方法、方法參數(shù)、字段、局部變量等。比如:a)方法上:@OverridevoidmySuperMethod(){...}@SuppressWarnings(value="unchecked")voidmyMethod(){...}b)類上:@Author(name="zphuan",date="3/24/2017")classMyClass(){...}使用的細(xì)節(jié):.如果注解沒有參數(shù)則不用寫參數(shù)體,比如@Override.如果只有一個參數(shù)比如namedvalue,則參數(shù)名可以省略,比如:@SuppressWarnings("unchecked")voidmyMethod(){...}.也可以同時使用多個注解來標(biāo)示,比如:@Author(name="JaneDoe")@EBookclassMyClass{...}.可以重復(fù)使用注解,不過只有在javaSE8才支持。比如:

傳智播客旗下ith端IT教育品牌傳智播客旗下ith端IT教育品牌Sm@Author(name="JohnSmwww.iWeima.cornclassMyClass{...}標(biāo)明兩個作者對該類的書寫,一個管理員,一個開發(fā)者等。注意:如果想自定義一個可以用于重復(fù)使用的注解(自定義注解在后面會涉及),記得加上,比如:@Repeatable(Schedules.class)public@interfaceSchedule{StringdayOfMonth()default"first";StringdayOfWeek()default"Mon";inthour()default12;}內(nèi)置注解Java本身提供了三個內(nèi)置注解,他們分別是:?@Depreca@SuppressWarnings@Deprecated可以用來描述一個類、方法或者字段,表示java不贊成使用這些被描述的對象,如果我們使用了這些類、方法或者字段,編譯器會給我們警告。@Override注解是一個編譯時注解,它主要用在一個子類的方法中,當(dāng)被注解的子類的方法在父類中找不到與之匹配的方法時,編譯器會報錯。@SuppressWarnings注解的作用是使編譯器忽略掉編譯器警告。比如,如果我們的一個方法調(diào)用了一個@Deprecated方法,或者做了一個不安全的類型轉(zhuǎn)換,此時編譯器會生成一個警告。如果我們不想看到這些警告,我們就可以使用@SuppressWarnings注解忽略掉這些警告.6自.定義注解很多的注解在代碼上可以用來替代注釋的存在!為什么這樣說?我舉一個例子:如果你所在的一家開發(fā)軟件的it公司有這樣的要求,說你寫的每一個class類都必須有以下這些的說明:publicclassGeneration3ListextendsGeneration2List{//Author:zphuan

Date:3/17/2002守播客旗下I警輸炳忠稻育品牌//By:JaneDoe//Reviewers:Alice,Bill,Cindy//classcodegoeshere}那么可能張三使用注釋的方式,李四使用文檔注釋的方式,王五使用注解的方式,每一個人的寫法和順序可能都不一樣,甚至剛來的人還不知這個代碼上次是誰修改的,有哪些人在調(diào)用和關(guān)聯(lián)這個類,沒辦法統(tǒng)一,那么作為一個團隊的leader你就可以在項目的初期創(chuàng)建一個自定義的注解Annotation來規(guī)范化所有class的申明!針對上面的這個需求,接下來我就來創(chuàng)建一個自定義的注解@interfaceClassPreamble{Stringauthor();Stringdate();intcurrentRevision()default1;StringlastModified()default"N/A";StringlastModifiedBy()default"N/A";//NoteuseofarrayString[]reviewers();}注意,?interface關(guān)鍵字就代表這是一個注解類型,所以使用?interface關(guān)鍵字就可以創(chuàng)建注解了。注解中的每個元素定義類似于接口中的方法定義。每個元素定義包含一個數(shù)據(jù)類型和名稱,注解元素的數(shù)據(jù)類型可以是java基本數(shù)據(jù)類型、String、數(shù)組,但不能是復(fù)雜對象類型。我們可以通過default關(guān)鍵字為某個元素設(shè)置默認(rèn)值,當(dāng)一個元素被設(shè)置默認(rèn)值之后,這個元素便成了注解的可選元素。那么接下來我們就可以使用注解來演示每一個類的描述了:@ClassPreamble(author="zphuan",date="3/17/2002",currentRevision=6,lastModified="4/12/2004",lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})}這樣寫就能進(jìn)行一個類的描述的規(guī)范化和統(tǒng)一了。那么可能有人會問了:這樣用注解的方式寫沒有文檔注釋方便,可以在使用該類的時候直接用看到該類的描述。在java中相信大家對?Documented這個注解非常熟悉吧?沒錯,這個注解的作用就是java用來提供給大家將你的信息注入到j(luò)ava-doc文檔中,作為api的文檔描述查看。那么我們完全可以在我們自定義的注解上使用?Documented,比如://importthistouse@Documentedimportjava.lang.annotation.作用是告訴工具,當(dāng)前注解本身也要顯示在作用是告訴工具,當(dāng)前注解本身也要顯示在中。比如上面我寫的自定義注解。??@Documented@interfaceClassPreamble{//Annotationelementdefinitions}這里的注解為什么能直接作用于我們自定義的注解?這里引入我們下面的元注解。7元.注解元注解就是用來描述注解的注解,在java中有以下幾個元注解:?@Documented

黑馬程,序員wwwJ傳智播客旗下高端IT黑馬程,序員wwwJ傳智播客旗下高端IT教育品牌用來定義當(dāng)前注解的作用范圍,有以下三個范圍可選:■注解只存在于源碼中,不會存在于文件中,在編譯時會被忽略掉■:注解只存在于文件中,在編譯期有效,但是在運行期會被忽略掉,這也是默認(rè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.■通過名字就可以看出來他們的元素類型,不過有兩個需要特別說明下:元注解類型,只能用來注解其它的注解,例如■:可以用來注解任何類型的類,如類、接口、枚舉、或者注解類。■■@Inherited注解表示當(dāng)前注解會被注解類的子類繼承。比如有一個自定義注解:@Inheritedpublic@interfaceInheritedAnnotation{}■如果一個類使用了上面這個注解:■@InheritedAnnotation“muaut…mfdat

傳智播客旗下=毒喘u平教育品牌"3/17/2002",currentRevision=6,lastModified="4/12/2004”,lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})publicclassGeneration3List{}?那么的子類也會繼承這個注解。?解析注解的詳細(xì)使用已經(jīng)介紹完了,那么在現(xiàn)實開發(fā)中我們一般如何使用呢?一般我們會自定義一些注解,來簡化和設(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行起來的時候我想要獲取到Generation3List中的快,ClassPreamble注解中的信息:author,date,currentReviSion。實現(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)再舉個獲取方法注解信息的例子。我定義了一個用于方法上的運行時注解:@Retention(RetentionPolicy.RUNTIME);二;,.!@Target(value={ElementType.METHOD}),急y二二:「蓼'二//節(jié)曲lic/螂nterfce/MethodAnno憎tion{"點的蛙匹典曲出配處也里也型娶照日preooibLeautrior:zphu£inP「/m/1/c/r/en/RiString/author。;p「t?cnblt?mte:3/1冊幽電gcate();該注解作用與下面這個類中的test方法上:publicclassGeneration3List{@MethodAnnotation(author="zphuan",date="3/26/2017")publicvoidtest(){}}現(xiàn)在我想要獲取到該方法上的注解信息,可以這樣反射獲?。簍ry{

?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)然獲取其他比如三個方法的作用即可: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則表示得到該所有表示該是否被某個“福信0n因為一個加~可以被多個'no4Console£3<tenriiiiiatecJ>M^in(11authoAnnnoodote3/26/2017則表示得到該所有表示該是否被某個修飾解析2編譯時(1)編譯時Annotation指?Retention為CLASS的Annotation,1編譯器自動解析。解析需要做的a.自定義類集成自AbstractProcessorb.重寫其中的process函數(shù)⑵創(chuàng)建一個注解類型為CLASS的Annotation,如下:@Retention(RetentionPolicy.CLASS)public@interfaceClassAnnotation{Stringauthor();}(3)作用于Generation3List@ClassAnnotation(author="zphuan")publicclassGeneration3List{@MethodAnnotation(author="zphuan",date="3/26/2017")publicvoidtest(){}}(4)編譯時解析: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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論