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

操作方法

  • 01

    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 :关于以上一切状况的正告。

(0)

相关推荐

  • java中引用的概念(JAVA的引用调用)

    Java中为什么没有指针?我们都知道Java与c/c 有个显著的区别就是c/c 有指针的使用,而Java中没有用到指针.之所以Java没有指针的使用(没有显示的使用指针,内部实现机制肯定是有指针的), ...

  • 操作系统中线程和进程的概念

    一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 ...

  • java 中字节和字符的详解

    一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件. ...

  • java中对象和对象的引用

    在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然. 操作方法 01 1.何谓对 ...

  • java中的常量定义 final 的问题解决方法

    Java 中我们常常需要定义一些常量ID,ID值为连续不重复值 方法1:, 方便的定义,方便增减ID 非常方便, 程序保证不会有重复的ID public static class HandleMess ...

  • JAVA中Properties类使用方法介绍

    在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用"#"来注释.Properties属性文件是软件常用的 ...

  • 如何在win10 java中正确配置环境变量

    有的小伙伴在Windows10系统中使用java编程时,需要根据环境,来配置环境变量,但是却不知道如何正确配置,那么小编就来为大家介绍一下吧.具体如下:1. 第一步,点击桌面底部的搜索栏,接着输入并搜 ...

  • java 中堆和栈的区别方法

    一直以来对java中堆和栈都有点模糊:现在终于搞明白啦 特点: 1. 栈的特点是 : 容量小 速度快 适合存放小型数据 如基本数据类型和对象类型的引用 在栈中变量直接指向存放变量值的空间 对于对象引用 ...

  • java中的invoke方法

    在了解Java中的invoke()方法前,我们需要知道在哪些场景用到了java反射机制以及如何使用. 操作方法 01 一.反射机制应用场景:逆向代码.动态生成类框架等,使用反射机制能够大大的增强程序的 ...