|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!甚么是注解(Annotation):
Annotation(注解)就是Java供应了一种元程序中的元素联系关系任何信息和着任何元数据(metadata)的路子和办法。Annotion(注解)是一个接口,程序能够经由过程反射来猎取指定程序元素的Annotion对象,然后经由过程Annotion对象来猎取注解内里的元数据。
Annotation(注解)是JDK5.0及今后版本引进的。它能够用于创立文档,跟踪代码中的依附性,乃至实行基础编译时反省。从某些方面看,annotation就像润色符一样被利用,并使用于包、类型、机关办法、办法、成员变量、参数、当地变量的声明中。这些信息被存储在Annotation的“name=value”布局对中。
Annotation的成员在Annotation范例中以无参数的办法的情势被声明。其办法名和前往值界说了该成员的名字和范例。在此有一个特定的默许语法:同意声明任何Annotation成员的默许值:一个Annotation能够将name=value对作为没有界说默许值的Annotation成员的值,固然也能够利用name=value对来掩盖别的成员默许值。这一点有些近似类的承继特征,父类的机关函数能够作为子类的默许机关函数,可是也能够被子类掩盖。
Annotation能被用来为某个程序元素(类、办法、成员变量等)联系关系任何的信息。必要注重的是,这里存在着一个基础的划定规矩:Annotation不克不及影响程序代码的实行,不管增添、删除Annotation,代码都持之以恒的实行。别的,只管一些annotation经由过程java的反射api办法在运转时被会见,而java言语注释器在事情时疏忽了这些annotation。恰是因为java假造机疏忽了Annotation,招致了annotation范例在代码中是“不起感化”的;只要经由过程某种配套的工具才会对annotation范例中的信息举行会见和处置。本文中将涵盖尺度的Annotation和meta-annotation范例,伴随这些annotation范例的工具是java编译器(固然要以某种特别的体例处置它们)。
甚么是metadata(元数据):
元数据从metadata一词译来,就是“关于数据的数据”的意义。
元数据的功效感化有良多,好比:你大概用过Javadoc的正文主动天生文档。这就是元数据功效的一种。总的来讲,元数据能够用来创立文档,跟踪代码的依附性,实行编译时格局反省,取代已有的设置文件。假如要关于元数据的感化举行分类,今朝还没有明白的界说,不外我们能够依据它所起的感化,大抵可分为三类:
1.编写文档:经由过程代码里标识的元数据天生文档
2.代码剖析:经由过程代码里标识的元数据对代码举行剖析
3.编译反省:经由过程代码里标识的元数据让编译器能完成基础的编译反省
在Java中元数据以标签的情势存在于Java代码中,元数据标签的存在其实不影响程序代码的编译和实行,它只是被用来天生别的的文件或针在运转时晓得被运转代码的形貌信息。
综上所述:
第一,元数据以标签的情势存在于Java代码中。
第二,元数据形貌的信息是范例平安的,即元数据外部的字段都是有明白范例的。
第三,元数据必要编译器以外的工具分外的处置用来天生别的的程序部件。
第四,元数据能够只存在于Java源代码级别,也能够存在于编译以后的Class文件外部。
Annotation和Annotation范例:
Annotation:
Annotation利用了在java5.0所带来的新语法,它的举动非常相似public、final如许的润色符。每一个Annotation具有一个名字和成员个数>=0。每一个Annotation的成员具有被称为name=value对的名字和值(就像javabean一样),name=value装载了Annotation的信息。
Annotation范例:
Annotation范例界说了Annotation的名字、范例、成员默许值。一个Annotation范例能够说是一个特别的java接口,它的成员变量是受限定的,而声明Annotation范例时必要利用新语法。当我们经由过程java反射api会见Annotation时,前往值将是一个完成了该annotation范例接口的对象,经由过程会见这个对象我们能便利的会见到其Annotation成员。前面的章节将提到在java5.0的java.lang包里包括的3个尺度Annotation范例。
注解的分类:
依据注解参数的个数,我们能够将注解分为三类:
1.标志注解:一个没有成员界说的Annotation范例被称为标志注解。这类Annotation范例仅利用本身的存在与否来为我们供应信息。好比前面的体系注解@Override;
2.单值注解
3.完全注解
依据注解利用办法和用处,我们能够将Annotation分为三类:
1.JDK内置体系注解
2.元注解
3.自界说注解
体系内置尺度注解:
注解的语法对照复杂,除@标记的利用外,他基础与Java固有的语法分歧,JavaSE中内置三个尺度注解,界说在java.lang中:
@Override:用于润色此办法掩盖了父类的办法;
@Deprecated:用于润色已过期的办法;
@SuppressWarnnings:用于关照java编译器克制特定的编译告诫。
上面我们顺次看看三个内置尺度注解的感化和利用场景。
@Override,限制重写父类办法:
@Override是一个标志注解范例,它被用作标注办法。它申明了被标注的办法重载了父类的办法,起到了断言的感化。假如我们利用了这类Annotation在一个没有掩盖父类办法的办法时,java编译器将以一个编译毛病来警示。这个annotaton经常在我们试图掩盖父类办法而确又写错了办法名时发扬能力。利用办法极为复杂:在利用此annotation时只需在被润色的办法后面加上@Override便可。上面的代码是一个利用@Override润色一个妄图重载父类的displayName()办法,而又存在拼写毛病的实例:
<br>- publicclassFruit{publicvoiddisplayName(){System.out.println("生果的名字是:*****");}}classOrangeextendsFruit{@OverridepublicvoiddisplayName(){System.out.println("生果的名字是:桔子");}}classAppleextendsFruit{@Overridepublicvoiddisplayname(){System.out.println("生果的名字是:苹果");}}
复制代码
<br>
- Orange类编译不会有任何成绩,Apple类在编译的时分会提醒响应的毛病。@Override注解只能用于办法,不克不及用于其他程序元素。
复制代码 @Deprecated,标志已过期:
同样Deprecated也是一个标志注解。当一个范例大概范例成员利用@Deprecated润色的话,编译器将不勉励利用这个被标注的程序元素。并且这类润色具有必定的“持续性”:假如我们在代码中经由过程承继大概掩盖的体例利用了这个过期的范例大概成员,固然承继大概掩盖后的范例大概成员并非被声明为@Deprecated,但编译器仍旧要报警。
值得注重,@Deprecated这个annotation范例和javadoc中的@deprecated这个tag是有区分的:前者是java编译器辨认的,尔后者是被javadoc工具所辨认用来天生文档(包括程序成员为何已过时、它应该怎样被克制大概替换的形貌)。
在java5.0,java编译器仍旧象其夙昔版本那样寻觅@deprecated这个javadoctag,并利用它们发生告诫信息。可是这类情况将在后续版本中改动,我们应在如今就入手下手利用@Deprecated来润色过期的办法而不是@deprecatedjavadoctag。
上面一段程序中利用了@Deprecated注解标示办法过时,同时在办法正文顶用@deprecatedtag标示该办法已过期,代码以下:
<br>- classAppleService{publicvoiddisplayName(){System.out.println("生果的名字是:苹果");}/***@deprecated该办法已过时,不保举利用*/@DeprecatedpublicvoidshowTaste(){System.out.println("生果的苹果的口感是:脆甜");}publicvoidshowTaste(inttypeId){if(typeId==1){System.out.println("生果的苹果的口感是:酸涩");}elseif(typeId==2){System.out.println("生果的苹果的口感是:绵甜");}else{System.out.println("生果的苹果的口感是:脆甜");}}}publicclassFruitRun{/***@paramargs*/publicstaticvoidmain(String[]args){Appleapple=newApple();apple.displayName();AppleServiceappleService=newAppleService();appleService.showTaste();appleService.showTaste(0);appleService.showTaste(2);}}
复制代码
<br>
AppleService类的showTaste()办法被@Deprecated标注为过期办法,在FruitRun类中利用的时分,编译器会给出该办法已过时,不保举利用的提醒。
SuppressWarnnings,克制编译器告诫:
@SuppressWarnings被用于有选择的封闭编译器对类、办法、成员变量、变量初始化的告诫。在java5.0,sun供应的javac编译器为我们供应了-Xlint选项来使编译器对正当的程序代码提出告诫,此种告诫从某种水平上代表了程序毛病。比方当我们利用一个genericcollection类而又没有供应它的范例时,编译器将提醒出"uncheckedwarning"的告诫。一般当这类情形产生时,我们就必要查找引发告诫的代码。假如它真的暗示毛病,我们就必要改正它。比方假如告诫信息标明我们代码中的switch语句没有掩盖一切大概的case,那末我们就应增添一个默许的case来制止这类告诫。
偶然我们没法制止这类告诫,比方,我们利用必需和非generic的旧代码交互的genericcollection类时,我们不克不及制止这个uncheckedwarning。此时@SuppressWarning就要派上用处了,在挪用的办法前增添@SuppressWarnings润色,告知编译器中断对此办法的告诫。
SuppressWarning不是一个标志注解。它有一个范例为String[]的成员,这个成员的值为被克制的告诫名。关于javac编译器来说,被-Xlint选项无效的告诫名也一样对@SuppressWarings无效,同时编译器疏忽失落没法辨认的告诫名。
annotation语法同意在annotation名后跟括号,括号中是利用逗号支解的name=value对用于为annotation的成员赋值。实比方下:
<br>- publicclassFruitService{@SuppressWarnings(value={"rawtypes","unchecked"})publicstaticList<Fruit>getFruitList(){List<Fruit>fruitList=newArrayList();returnfruitList;}@SuppressWarnings({"rawtypes","unchecked"})publicstaticList<Fruit>getFruit(){List<Fruit>fruitList=newArrayList();returnfruitList;}@SuppressWarnings("unused")publicstaticvoidmain(String[]args){List<String>strList=newArrayList<String>();}}
复制代码
<br>
在1995年5月23日以“Java”的名称正式发布了。 |
|