重庆达渝仁科技官网:又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式。注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Annotation的类型检查,使得在编译期间就可以排除语法错误。注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。Java注解已经在很多框架中得到了广泛的使用,用来简化程序中的配置。从某种角度来说,可以把注解看成是一个XML元素,该元素可以有不同的预定义的属性。而属性的值是可以在声明该元素的时候自行指定的。在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。2.常见的使用注解的场景生成文档。这是最常见的,也是java最早提供的注解。常用的有@see@param@return等在编译时进行格式检查。如@override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring2.5开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。一些常用的开源框架,大都采用注解形式的配置方式。3.基本注解在JDK5中,内置了3个通用目的的注解Annotation,这三个内置的注解在java.lang包下:@Override:这个注解常用在继承类或实现接口的子类方法上,表面该方法是子类覆盖父类的方法,该方法的方法签名要遵循覆盖方法的原则:即访问控制权限必能比父类更严格,不能比父类抛出更多的异常。@Deprecated:这个注解告诉编译器该元素是过时的,即在目前的JDK版本中已经有新的元素代替该元素。@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc@deprecated,因为它不支持参数,重庆达渝仁科技官网:@SuppressWarnings:该注解关闭编译器中不合适的警告,即强行压制编译器的警告提示,SuppressWarnings包含的参数有:1.deprecation:使用了过时的类或方法时的警告2.unchecked:执行了未检查的转换时的警告3.fallthrough:当Switch程序块直接通往下一种情况而没有Break时的警告4.path:在类路径、源文件路径等中有不存在的路径时的警告5.serial:当在可序列化的类上缺少serialVersionUID定义时的警告6.finally:任何finally子句不能正常完成时的警告7.all:关于以上所有情况的警告4.自定义注解4.1注解的定义没有任何元素的空注解Annotation叫做标记Annotation.在声明注解的时候往往需要使用@Target,@Retention等注解,这种注解被称为注解的注解(元数据注解),即是专门用于处理注解Annotation本身的。@Target注解:用于指示注解所应用的目标程序元素种类,该注解常和ElementType枚举类型一起联合使用,ElementType枚举提供了java程序中声明的元素类型如下:a.ANNOTATION_TYPE:注释类型声明。b.CONSTRUCTOR:构造方法声明。c.FIELD:字段声明(包括枚举常量)。d.LOCAL_VARIABLE:局部变量声明。e.METHOD:方法声明。f.PACKAGE:包声明。g.PARAMETER:参数声明。h.TYPE::类,接口或枚举声明。@Retention注解:该注解用于指示所定义的注解类型的注释在程序声明周期中得保留范围,该注解常和RetentionPolicy枚举联合使用。RetentionPolicy枚举常量定义了注解在代码中的保留策略:重庆达渝仁科技官网::编译器把注解记录在类文件中,但在运行时JVM不需要保留注解。b.RUNTIME:编译器把注解记录在类文件中,在运行时JVM将保留注解,因此可以通过反射机制读取注解。c.SOURCE:仅保留在源码中,编译器在编译时就要丢弃掉该注解。Annotation注解中的元素只能是下面的数据类型:java的8中基本类型,如int,boolean等等,如果可以自动装箱和拆箱,则可以使用对应的对象包装类型。String类型。.Class类型。Enums类型。Annotation类型。以上类型的数组。除了上面这些类型以外,如果在注解中定义其他类型的数据,编译器将会报错。注意:注解中的元素要么指定默认值,要么由使用的类赋值,如果即没有默认值,使用类也没有赋值的话,注解元素是不会像普通类成员变量一样给定默认值,即必须赋值或者显示指定默认值。如果注解中有一个名称为value的属性,且只想设置value的属性(即其它属性都采用默认值或只有一个value属性)那么可以省略“value=”部分。1.importjava.lang.annotation.*;2.3.@Target(ElementType.METHOD)4.@Retention(RetentionPolicy.RUNTIME)5.public@interfaceDefaultValue{6.publicintid()default-1;7.publicStringdescription()default“”;8.}4.2注解的生命周期一个注解的生命周期包括三个阶段:重庆达渝仁科技官网:文件---内存中的字节码如果一个注解不声明自己的生命周期属于那个阶段,会默认为生命周期是class文件阶段。但它也可以由一个@Retetion的元注解指定它的生命周期。java源文件当在一个注解类前定义了一个@Retetion(RetentionPolicy.SOURCE)的注解,那么说明该注解只保留在一个源文件当中,当编译器将源文件编译成class文件时,它不会将源文件中定义的注解保留在class文件中。class文件中当在一个注解类前定义了一个@Retetion(RetentionPolicy.CLASS)的注解,那么说明该注解只保留在一个class文件当中,当加载class文件到内存时,虚拟机会将注解去掉,从而在程序中不能访问。程序运行期间当在一个注解类前定义了一个@Retetion(RetentionPolicy.RUNTIME)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解。5.注解的使用注解的使用分为三个过程。定义注解--声明注解--得到注解5.1定义注解一个简单的注解:1.public@interfaceAnnotation01{2.//定义公共的final静态属性.....3.//定以公共的抽象方法......4.}注解可以有哪些成员重庆达渝仁科技官网:注解和接口相似,它只能定义final静态属性和公共抽象方法。注解的方法1.方法前默认会加上publicabstract2.在声明方法时可以定义方法的默认返回值。例如:1.Stringcolor()defaultblue;2.String[]color()default{blue,red,......}3.方法的返回值可以有哪些类型8种基本类型,String、Class、枚举、注解及这些类型的数组。5.2声明注解1.在哪些元素上声明注解如果定义注解时没有指定@Target元注解来限制它的使用范围,那么该注解可以使用在ElementType枚举指定的任何一个元素前。否则,只能声明在@Target元注解指定的元素前。一般声明的形式:@注解名()2.对注解的方法的返回值进行赋值对于注解中定义的每一个没有默认返回值的方法,在声明注解时必须对它的每一个方法的返回值进行赋值。一般形式:@注解名(方法名=方法返回值,......)如果方法返回的是一个数组时,那么将方法返回值写在{}符号里@注解名(方法名={返回值1,返回值2,……},…...)3.对于只含有value方法的注解,在声明注解时可以只写返回值。5.3得到注解对于生命周期为运行期间的注解,都可以通过反射获得该元素上的注解实例。1、声明在一个类中的注解重庆达渝仁科技官网:方法获得。2、声明在一个字段中的注解通过Field对象的getAnnotation或getAnnotations方法获得3、声明在一个方法中的注解通过Method对象的getAnnotation或getAnnotations方法获得6测试案例自定义Annotation类1.importjava.lang.annotation.ElementType;2.importjava.lang.annotation.Retention;3.importjava.lang.annotation.RetentionPolicy;4.importjava.lang.annotation.Target;5.6./**7.*定义一个Annotation8.*9.*@authorsguotao10.*@version[VersionNumber,2014-12-1]11.*@see[RelevantClass/Method]12.*@since[Product/ModuleVersion]13.*/14.@Retention(RetentionPolicy.RUNTIME)15.@Target({ElementType.METHOD,ElementType.TYPE})16.public@interfaceMyAnnotation{17./*18.*基本类型19.*/20.intage()default18;21.22./*23.*String类型24.*/25.Stringname();重庆达渝仁科技官网:()defaultsguotao;28.29./*30.*Enums类型31.*/32.GendergetGender()defaultGender.MALE;33.34./*35.*数组类型36.*/37.String[]week()default{Monday,Tuesday,Wednesday,Thursday,Friday};38.39./*40.*注解类型41.*/42.CustomAnnotationgetDescribe()default@CustomAnnotation(describe=thisisaannotationtesting...);43.}测试Enums类1./**2.*@authorsguotao3.*@version[VersionNumber,2014-12-1]4.*@see[RelevantClass/Method]5.*@since[Product/ModuleVersion]6.*/7.publicenumGender{8.MALE{9.@Override10.publicStringgetGender(){11.returnMale;12.}重庆达渝仁科技官网:},14.FEMALE{15.16.@Override17.publicStringgetGender(){18.returnFemale;19.}20.21.};22.23.publicabstractStr