您的位置:首页 > 编程语言 > Java开发

Java中注解(Annotation)的根本概念

2014-03-18 17:26 337 查看
Java中注解(Annotation)的根本概念啥是注解(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的注释主动生成文档。这即是元数据 功用的一种。总的来说,元数据能够用来创立文档,盯梢代码的依赖性,履行编译时格局查看,代替已 有的配置文件。若是要关于元数据的效果进行分类,当前还没有清晰的界说,不过咱们能够依据它所起 的效果,大致可分为三类:p>1. 编写文档:通过代码里标识的元数据生成文档p>2. 代码剖析:通过代 码里标识的元数据对代码进行剖析p>3. 编译查看:通过代码里标识的元数据让编译器能完结根本的编 译查看
在Java中元数据以标签的办法存在于Java代码中,元数据标签的存在并不影响程序代码的编 译和履行,它仅仅被用来生成其它的文件或针在运转时晓得被运转代码的描绘信息。
综上所述:p> 榜首,元数据以标签的办法存在于Java代码中。p>第二,元数据描绘的信息是类型安全的,即元数据内 部的字段都是有清晰类型的。p>第三,元数据需求编译器之外的东西额定的处置用来生成其它的程序部 件。p>第四,元数据能够只存在于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类型。Java中注解(Annotation)的根本概念(2)注解的分类:
依据注解参数的个数,咱们能够将注解分为三类:p>1.符号注解:一个没 有成员界说的Annotation类型被称为符号注解。这种Annotation类型仅运用本身的存在与否来为咱们提 供信息。比方后边的体系注解@Override;p>2.单值注解p>3.完好注解
依据注解运用办法和用处 ,咱们能够将Annotation分为三类:p>1.JDK内置体系注解p>2.元注解p>3.自界说注解
体系内 置规范注解:
注解的语法比较简略,除了@符号的运用外,他根本与Java固有的语法共同, JavaSE中内置三个规范注解,界说在java.lang中:p>@Override:用于润饰此办法掩盖了父类的方 法;p>@Deprecated:用于润饰现已过期的办法;p>@SuppressWarnnings:用于通知java编译器制止特定的 编译正告。
下面咱们顺次看看三个内置规范注解的效果和运用场景。
@Override,限制 重写父类办法:
@Override 是一个符号注解类型,它被用作标明办法。它阐明晰被标明的办法 重载了父类的办法,起到了断语的效果。若是咱们运用了这种Annotation在一个没有掩盖父类办法的方 法时,java编译器将以一个编译过错来警示。这个annotaton常常在咱们妄图掩盖父类办法而确又写错 了办法名时发扬威力。运用办法极端简略:在运用此annotation时只需在被润饰的办法前面加上 @Override即可。下面的代码是一个运用@Override润饰一个妄图重载父类的displayName()办法,而又 存在拼写过错的实例:
public class Fruit { public void displayName(){ System.out.println("生果的姓名是:*****"); } } class Orange extends Fruit { @Override public void displayName(){ System.out.println("生果的姓名是:桔子"); } } class Apple extends Fruit { @Override public void displayname(){ System.out.println("生果的姓名是:苹果"); } }Orange 类编译不会有任何问题,Apple 类在编译的时分会提示相应的过错。@Override注解 只能用于办法,不能用于其他程序元素。
@Deprecated,符号已过期:
同 样Deprecated 也是一个符号注解。当一个类型或许类型成员运用@Deprecated润饰的话,编译器将不鼓舞运用这个被 标明的程序元素。并且这种润饰具有必定的 “延续性”:若是咱们在代码中通过承继或许掩盖的办法 运用了这个过期的类型或许成员,尽管承继或许掩盖后的类型或许成员并不是被声明为 @Deprecated, 但编译器依然要报警。
值得注意,@Deprecated这个annotation类型和javadoc中的 @deprecated这个tag是有差异的:前者是java编译器识另外,而后者是被javadoc东西所辨认用来生成 文档(包括程序成员为啥现已过 时、它应当怎么被制止或许代替的描绘)。
在java5.0, java编译器依然象其早年版别那样寻觅@deprecated这个javadoc tag,并运用它们发作正告信息。可是 这种状况将在后续版别中改动,咱们应在如今就开始运用@Deprecated来润饰过期的办法而不是 @deprecated javadoc tag。Java中注解(Annotation)的根本概念(3)下面一段程序中运用了@Deprecated注解标明办法过期,一起在方 法注释顶用@deprecated tag 标明该办法现已过期,代码如下:
class AppleService { public void displayName(){ System.out.println("生果的姓名是:苹果"); } /** * @deprecated 该办法现已过期,不引荐运用 */ @Deprecated public void showTaste(){ System.out.println("生果的苹果的口感是:脆甜"); } public void showTaste(int typeId){ if(typeId==1){ System.out.println("生果的苹果的口感是:酸涩"); } else if(typeId==2){ System.out.println("生果的苹果的口感是:绵甜"); } else{ System.out.println("生果的苹果的口感是:脆甜"); } } } public class FruitRun { /** * @param args */ public static void main(String[] args) { Apple apple=new Apple(); apple.displayName(); AppleService appleService=new AppleService(); appleService.showTaste(); appleService.showTaste(0); appleService.showTaste(2); } }Java中注解(Annotation)的根本概念(4)AppleService类的showTaste() 办法被@Deprecated标明为过期办法,在FruitRun类中运用 的时分,编译器会给出该办法已过期,不引荐运用的提示。
SuppressWarnnings,按捺编译器警 告:
@SuppressWarnings 被用于有挑选的封闭编译器对类、办法、成员变量、变量初始化的警 告。在java5.0,sun供给的javac编译器为咱们供给了-Xlint选项来使编译器对合法的程序代码提出警 告,此种正告从某种程度上代表了程序过错。例如当咱们运用一个generic collection类而又没有供给 它的类型时,编译器将提示出"unchecked warning"的正告。一般当这种状况发作时,咱们 就需求查找导致正告的代码。若是它真的标明过错,咱们就需求纠正它。例如若是正告信息标明咱们代 码中的switch句子没有掩盖一切能够的case,那么咱们就应添加一个默许的case来防止这种正告。
有时咱们无法防止这种正告,例如,咱们运用有必要和非generic的旧代码交互的generic collection类 时,咱们不能防止这个unchecked warning。此刻@SuppressWarning就要派上用场了,在调用的办法前 添加@SuppressWarnings润饰,通知编译器中止对此办法的正告。
SuppressWarning不是一个符号注 解。它有一个类型为String[]的成员,这个成员的值为被制止的正告名。关于javac编译器来讲,被- Xlint选项有用的正告 名也相同对@SuppressWarings有用,一起编译器疏忽掉无法识另外正告名。
annotation语法答应在annotation名后跟括号,括号中是运用逗号切割的name=value对用于为 annotation的成员赋值。实例如下:
public class FruitService { @SuppressWarnings(value={ "rawtypes", "unchecked" }) public static ListgetFruitList(){ ListfruitList=new ArrayList(); return fruitList; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static ListgetFruit(){ ListfruitList=new ArrayList(); return fruitList; } @SuppressWarnings("unused") public static void main(String[] args){ ListstrList=new ArrayList(); } }在这个比方中SuppressWarnings annotation类型只界说了一个单一的成员,所以只需一个 简略的value={...}作为name=value对。又因为成员值是一个数组,故运用大括号来声明数组值。注意 :咱们能够鄙人面的状况中缩写annotation:当annotation只需单一成员,并成员命名为 "value="。这时能够省去"value="。比方将上面办法getFruit()的 SuppressWarnings annotation即是缩写的。
SuppressWarnings注解的常见参数值的简略阐明 :
 1.deprecation:运用了不赞成运用的类或办法时的正告;p>2.unchecked:履行了未查看 的变换时的正告,例如当运用调集时没有用泛型 (Generics) 来指定调集保管的类 型;
3.fallthrough:当 Switch 程序块直接通往下一种状况而没有 Break 时的正告;p>4.path:在 类途径、源文件途径等中有不存在的途径时的正告; p>5.serial:当在可序列化的类上短少 serialVersionUID 界说时的正告;
6.finally:任何 finally 子句不能正常完结时的正告;
7.all :关于以上一切状况的正告。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 程序 接口