【黑马程序员】Java中的Annotation详解_第1页
【黑马程序员】Java中的Annotation详解_第2页
【黑马程序员】Java中的Annotation详解_第3页
【黑马程序员】Java中的Annotation详解_第4页
【黑马程序员】Java中的Annotation详解_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

黑马程序员成都中心编著黑马程序员成都中心编著传智播客详i高端传智播客详i高端it教育品牌wwwJtheima,com前言:作为Java开发人员,经常能在代码中看到注解(Annotation),有的是JAVA内置的注解,或者是在使用一些三方的开源框架的代码时候看到一些别人的自定义注解。如果你对注解不了解或者不知道如何使用,那么你在用这些三方框架的时候甚至在自己写源码修改源码的时候就会变得更加的困难和举步维艰。通过该篇文章可以基本的将注解Annotation的原理以及使用了解清楚,更加有利于你下一步比如使用Retrofit进行网络的开发打下基础。1概.念官方的定义:Anannotationisaformofmetadata,thatcanbeaddedtoJavasourcecode.Classes,methods,variables,parametersandpackagesmaybeannotated.Annotationshavenodirecteffectontheoperationofthecodetheyannotate.注解Annotation是JDK5.0的新特性,是一种能够添加到Java源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据与程序元素进行关联。Annotation中文常译为“注解”。2作.用标记,用于告诉编译器一些信息编译时动态处理,如动态生成代码运行时动态处理,如得到注解信息

打包编译后的代码和文在构建期程程时前打包编译后的代码和文在构建期程程时前进同源]、生成舅播客旗下「具自动完。常用。工具xml文件,件到ww.itheimjr河硒程一高而有ant、maven。构建工□在构建时会自动扫描我□的代码,当口到构建期注解时,会根据注解的内容生成源码或者其它文件3注.解的格式a)一个java注解由一个@符后面跟一个字符串「成□类似于这样:b)java注解中一般包含一些元素,这些元素类似于属性或者参数,可以用来设置值,比如我们有一个包含两个元素的@Entity注解:@Entity(userName="zphuan",us该注解中有两个元素:userName,userAge,分别赋予了对应的元素值。4注.解的位置注解可以用于描述一个类、接口、方法、方法参数、字段、局部变量等。比如:a)方法上:@OverridevoidmySuperMethod(){...}@SuppressWarnings(value="unchecked")voidmyMethod(){...}b)类上:@Author(name="zphuan",date="3/24/2017")classMyClass(){...}使用的细节:.如果注解没有参数则不用写参数体,比如@Override.如果只有一个参数比如namedvalue,则参数名可以省略,比如:@SuppressWarnings("unchecked")voidmyMethod(){...}.也可以同时使用多个注解来标示,比如:@Author(name="JaneDoe")@EBookclassMyClass{...}.可以重复使用注解,不过只有在javaSE8才支持。比如:

传智播客旗下ith端IT教育品牌传智播客旗下ith端IT教育品牌Sm@Author(name="JohnSmwww.iWeima.cornclassMyClass{...}标明两个作者对该类的书写,一个管理员,一个开发者等。注意:如果想自定义一个可以用于重复使用的注解(自定义注解在后面会涉及),记得加上,比如:@Repeatable(Schedules.class)public@interfaceSchedule{StringdayOfMonth()default"first";StringdayOfWeek()default"Mon";inthour()default12;}内置注解Java本身提供了三个内置注解,他们分别是:•@Depreca@SuppressWarnings@Deprecated可以用来描述一个类、方法或者字段,表示java不赞成使用这些被描述的对象,如果我们使用了这些类、方法或者字段,编译器会给我们警告。@Override注解是一个编译时注解,它主要用在一个子类的方法中,当被注解的子类的方法在父类中找不到与之匹配的方法时,编译器会报错。@SuppressWarnings注解的作用是使编译器忽略掉编译器警告。比如,如果我们的一个方法调用了一个@Deprecated方法,或者做了一个不安全的类型转换,此时编译器会生成一个警告。如果我们不想看到这些警告,我们就可以使用@SuppressWarnings注解忽略掉这些警告.6自.定义注解很多的注解在代码上可以用来替代注释的存在!为什么这样说?我举一个例子:如果你所在的一家开发软件的it公司有这样的要求,说你写的每一个class类都必须有以下这些的说明:publicclassGeneration3ListextendsGeneration2List{//Author:zphuan

Date:3/17/2002守播客旗下I警输炳忠稻育品牌//By:JaneDoe//Reviewers:Alice,Bill,Cindy//classcodegoeshere}那么可能张三使用注释的方式,李四使用文档注释的方式,王五使用注解的方式,每一个人的写法和顺序可能都不一样,甚至刚来的人还不知这个代码上次是谁修改的,有哪些人在调用和关联这个类,没办法统一,那么作为一个团队的leader你就可以在项目的初期创建一个自定义的注解Annotation来规范化所有class的申明!针对上面的这个需求,接下来我就来创建一个自定义的注解@interfaceClassPreamble{Stringauthor();Stringdate();intcurrentRevision()default1;StringlastModified()default"N/A";StringlastModifiedBy()default"N/A";//NoteuseofarrayString[]reviewers();}注意,©interface关键字就代表这是一个注解类型,所以使用©interface关键字就可以创建注解了。注解中的每个元素定义类似于接口中的方法定义。每个元素定义包含一个数据类型和名称,注解元素的数据类型可以是java基本数据类型、String、数组,但不能是复杂对象类型。我们可以通过default关键字为某个元素设置默认值,当一个元素被设置默认值之后,这个元素便成了注解的可选元素。那么接下来我们就可以使用注解来演示每一个类的描述了:@ClassPreamble(author="zphuan",date="3/17/2002",currentRevision=6,lastModified="4/12/2004",lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})}这样写就能进行一个类的描述的规范化和统一了。那么可能有人会问了:这样用注解的方式写没有文档注释方便,可以在使用该类的时候直接用看到该类的描述。在java中相信大家对©Documented这个注解非常熟悉吧?没错,这个注解的作用就是java用来提供给大家将你的信息注入到java-doc文档中,作为api的文档描述查看。那么我们完全可以在我们自定义的注解上使用©Documented,比如://importthistouse@Documentedimportjava.lang.annotation.作用是告诉工具,当前注解本身也要显示在作用是告诉工具,当前注解本身也要显示在中。比如上面我写的自定义注解。••@Documented@interfaceClassPreamble{//Annotationelementdefinitions}这里的注解为什么能直接作用于我们自定义的注解?这里引入我们下面的元注解。7元.注解元注解就是用来描述注解的注解,在java中有以下几个元注解:•@Documented

黑马程,序员wwwJ传智播客旗下高端IT黑马程,序员wwwJ传智播客旗下高端IT教育品牌用来定义当前注解的作用范围,有以下三个范围可选:■注解只存在于源码中,不会存在于文件中,在编译时会被忽略掉■:注解只存在于文件中,在编译期有效,但是在运行期会被忽略掉,这也是默认范围■:在运行期有效,在运行期通过反射获得注解信息■■■用于指定注解作用于的哪些元素,未标注则表示可修饰所有有以下这些元素类型可供选择:■■■ElementType.ANNOTATION_TYPEcanbeappliedtoanannotationtype.■ElementType.CONSTRUCTORcanbeappliedtoaconstructor.■ElementType.FIELDcanbeappliedtoafieldorproperty.■ElementType.LOCAL_VARIABLEcanbeappliedtoalocalvariable.

黑马程序员ElementType.METHODcanbJ黑马程序员ElementType.METHODcanbJ播"…appliedtoamethod-levelannotation.■ElementType.PACKAGEcanbeappliedtoapackagedeclaration.■ElementType.PARAMETERcanbeappliedtotheparametersofamethod.■ElementType.TYPEcanbeappliedtoanyelementofaclass.■通过名字就可以看出来他们的元素类型,不过有两个需要特别说明下:元注解类型,只能用来注解其它的注解,例如■:可以用来注解任何类型的类,如类、接口、枚举、或者注解类。■■@Inherited注解表示当前注解会被注解类的子类继承。比如有一个自定义注解:@Inheritedpublic@interfaceInheritedAnnotation{}■如果一个类使用了上面这个注解:■@InheritedAnnotation“muaut…mfdat

传智播客旗下=毒喘u平教育品牌"3/17/2002",currentRevision=6,lastModified="4/12/2004”,lastModifiedBy="JaneDoe",//Notearraynotationreviewers={"Alice","Bob","Cindy"})publicclassGeneration3List{}•那么的子类也会继承这个注解。•解析注解的详细使用已经介绍完了,那么在现实开发中我们一般如何使用呢?一般我们会自定义一些注解,来简化和设计我们的代码,然后在运行时通过反射机制获取到注解的信息来使用。•运行时解析•运行时指为的。比如下面是我自己写的一个运行时自定义注解: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。实现的方式如下: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());}}打印的结果为: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二二:「蓼'二//节曲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(){}}现在我想要获取到该方法上的注解信息,可以这样反射获取: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();}最后得到的结果为:164171814202122四24164171814202122四2425Z6以7当然获取其他比如三个方法的作用即可: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函数⑵创建一个注解类型为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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论