1,什么是注解
注解(Annotation)是一种元数据形式。属于java中的一中数据类型。是书写于java代码中的,但是书写的位置被固定在类、方法、变量、参数的前面。不会改变程序的操作,在开发和配置期间,注解信息可以在运行期进行获取。
从JDK1.5开始,注解语法提供了更为强大的功能,注解语法也被称为描述数据的数据(metadata)。它的作用可以用来生成文档,检查代码间的依赖关系,帮助编译器作语法检查等。
2,注解不是注释
注解是对代码的解释和说明,其目的是提高程序代码的可读性。注解是可以被编译器打包进入class文件。
注释只存在于java源代码中,对于编译和运行没有任何作用,也不会被编译到class文件中。注释是给程序员看的,编译器与JVM都不需要知道它。
3,注解的分类
注解语法支持两种注解:
1,JDK自带的Annotation注解
2,开发者自定义的Annotation注解
1,JDK自带的Annotation注解
常用的有三个:
@Override @Deprecated @SuppressWarnings
(2)、@Override
此注解用于限定重写父类(父接口)方法。对于子类中被@Override修饰的方法,如果存在对应的被重写的父类方法,则编译通过;如果不存在,则会编译报错。
@Override只能作用于方法,不能作用于其他的元素。
public class Student {
@Override
public String toString() {
return "这是一个重写方法";
}
}
(2)、@Deprecated
此注解是用于表示某个程序元素(类,方法等)已经过时,如果使用了被@Deprecated修饰的类和方法等,编译器会发出警告。过时的类和方法并不是代表了错误,只是有了更好的替代方法,而是不在推荐使用了。
@Deprecated
public class Student{
@Deprecated
public void study(){}
public static void main(String[] args){
Student s = new Student();
s.study(); }}
(3)、@SuppressWarnings
次注解用来抑制编译器警告。指示被@SuppressWarnings修饰的程序元素(以及该程序元素中的所有子元素,例如类以及该类中的方法等)取消显示的编译器警告。
@SuppressWarnings 抑制警告类型:
关键字 被抑制的警告类型
all 抑制所有警告
deprecation 抑制使用了过时的类或方法的警告
fallthrough 抑制switch块中没有break语句的警告
finally 抑制finally块中不能正常完成的警告
rawtypes 抑制没有使用泛型的警告
serial 抑制可序列化类没有使用序列化ID的警告
unchecked 抑制未检查操作的警告
unused 抑制变量或方法申明定义后未使用的警告
2,自定义注解
概述:注解其实就是一种标记,可以在程序代码中的关键节点(类,方法,变量,参数,包)上打上这些标记,然后程序在编译时或运行时可以检测到这些标记从而执行一些特殊操作。
在开发过程中,开发者开发者有时候需要自定义注解完成某些配置。自定义注解使用的基本流程如下:
第一步:定义注解——相当于定义标记
第二步:配置注解——把标记打在需要用到的程序代码中
第三步:解析注解——在编译期或运行时检测到标记,并进行特殊操作
自定义注解使用的关键字为:@interface
注解的本质就是一种特殊的接口。在底层的实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation.
4,注解类型的实现部分
注解在实现部分只能定义:注解类型元素
注解元素类型只能是:基本数据类型、String、Class、注解类型、枚举类型、以及前面这几种的一维数组。
注解类型元素说明
1、注解元素的访问修饰符只能是public,不写也默认为public。
2、注解元素的名字应该为名词形式。如果一个注解中只有一个类型元素,请把名字起成value,方便后面操作。
3、()不是定义方法参数列表的地方,也不能在括号中定义任何参数,就是一个特殊的语法。
4、default代表默认值,值必须和该注解元素的类型一致。
5、如果没有默认值,代表后面使用时必须给该类型元素赋值。
5,常用的元注解
概述:元注解是专门修饰注解的注解,是为了更好的设计自定义注解的细节而专门设计的。
@Target
此注解是专门用来限定某个自定义注解能被应用到Java代码的那些位置。它使用一个枚举类型ElementType定义了限定范围的选择。
ElementType 的枚举值,以及它们代表的含义:
枚举值 注解能够被应用的地方
ElementType.ANNOTATION_TYPE 注解类型的声明
ElementType.CONSTRUCTOR 构造方法的声明
ElementType.FIELD 属性的声明
ElementType.LOCAL_VARIABLE 局部变量的声明
ElementType.METHOD 方法的声明
ElementType.PACKAGE 包的声明
ElementType.PARAMETER 方法参数的声明
ElementType.TYPE 类,接口以及枚举的声明
@Retention
此注解是用来限定某个自定义注解的生命力。
注解的生命周期有三种:
(1),仅存在java源文件中
(2),被编译到class文件中
(3),运行期被加载到Class对象中
@Retention注解使用一个枚举类型RetentionPolicy定义了这三个选择:
RetentionPolicy.SOURCE:该注解被限定在Java源文件中,该注解不会参与编译也不会在运行期起任何作用。只能在源文件中可见,和注释没什么区别。
RetentionPolicy.CLASS: 该注解被编译到Class文件中,编译器可以在编译时根据注解做一些处理动作。但在运行时,JVM会忽略它,在运行期也不能读取到。
RetentionPolicy.RUNTIME:该注解可以在运行期的加载阶段被加载到Class对象中。在程序运行阶段,可以通过反射得到该注解,并通过判断是否有这个注解或这个注解中属性的值,从而执行不同的程序代码段。实际开发中的自定义注解,几乎都使用RetentionPolicy.RUNTIME。
在上面的三种方式,默认情况下,自定义注解使用的是RetentionPolicy.CLASS。
@Documented
@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到javadoc文档中。
@Inherited
@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。
6,注解Annotation的特殊语法
1、如果注解本身没有定义注解类型元素,那么在使用注解时可以省略()。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialAnnotation {
}
@SpecialAnnotation
public class SomeBean {
}
2、如果注解本身在其内部只定义了一个注解类型元素,并且命名为value,那么在使用注解时,可以直接书写为@注解名(注解值)。它和标准写法:@注解名(value=注解值)等效!
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialAnnotation {
String value();
}
@SpecialAnnotation(“ddd”)
public class SomeBean {
}
3、如果注解中某个注解类型元素是一个数组类型,在使用时只需要填入一个值,那么,在使用注解时,可以直接书写为@注解名(类型名=类型值)。它和标准写法@注解名(类型名={类型值})等效。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialAnnotation {
String[] addresses();
}
@SpecialAnnotation(addresses=“NYC”)
public class SomeBean {
}
4、如果一个注解的@Target定义为Element.PARAMETER,那么这个注解是配置在方法的形参前面的。
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialAnnotation {
String param();
}
public class SomeBean {
public void speak(
@SpecialAnnotation(param="name") String useName){
}}
7,总结
1,注解Annotation是一种元数据形式,属于java中的一种数据类型。书写的位置被固定为类、方法、变量、参数和包的申明部分。
2,注解Annotation可以用来生成文档,检查代码间依赖关系,帮助编译器作语法检查等。在开发和配置期间,注解信息可以在运行期进行获取。
3,注解语法支持两种注解:JDK自带的Annotation注解,开发者自定义的Annotation注解。
4,JDK自带的Annotation注解,常用的有三个@Override(强行检测子类方法是否重写了父类方法)、@Deprecated(标记类或方法是过时的)、@SuppressWarnings(抑制编译器警告。)
5,自定义注解使用关键字@interface。注解本质是一种特殊的接口,在底层实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation。
6,@Target元注解可以限定该注解的应用范围。
7,@Retention注解,是用来限定某个自定义注解的生命力。该注解申明为RetentionPolicy.RUNTIME时,可以在运行期间通过反射的方式获取信息。