多语言展示
当前在线:674今日阅读:113今日分享:31

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

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 :关于以上全部情况的警告。
推荐信息