【本文详细介绍了 JAVA 应用开发中的注解( annotation ),欢迎读者朋友们阅读、转发和收藏!】
1 基础知识
1.1 注解基本概念
Annontation 是 Java 5 开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据( metadata )与程序元素(类、方法、成员变量等)进行关联。更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。
Annontation 像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。
1.2 注解的作用
Annontation 可起到的作用为:
① 编写文档:通过代码里标识的元数据生成文档【生成文档 doc 文档】
这是最常见的,也是 java 最早提供的注解。常用的有 @see @param @return 等
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③ 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【 Override 】
如 @override 放在方法前,如果该这个方法并不是覆盖了超类方法,则编译时就能检查出。
1.3 注解分类
Annontation 分为标准注解、元注解和自定义注解三种:
1 标准注解
包括 @Override, @Deprecated, @SuppressWarnings ,标准 Annotation 是指 Java 自带的几个 Annotation ,上面三个分别表示重载函数,不鼓励使用 ( 有更好方式、使用有风险或已不在维护 ) ,忽略某项 Warning 。
Ø @Override
java.lang.Override 是一个 marker annotation 类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种 annotation 在一个没有覆盖父类方法的方法时, java 编译器将以一个编译错误来警示。
这个 annotation 常常在我们试图覆盖父类方法而确又写错了方法名时加一个保障性的校验过程。
Ø @Deprecated
Deprecated 也是一种 marker annotation 。当一个类型或者类型成员使用 @Deprecated 修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的 “ 延续性 ” :如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为 @Deprecated ,但编译器仍然要报警。
注意: @Deprecated 这个 annotation 类型和 javadoc 中的 @deprecated 这个 tag 是有区别的:前者是 java 编译器识别的,而后者是被 javadoc 工具所识别用来生成文档(包含程序成员为什么已经过时、它应当如何被禁止或者替代的描述)。
Ø @SuppressWarnings
此注解能告诉 Java 编译器关闭对类、方法及成员变量的警告。有时编译时会提出一些警告,对于这些警告有的隐藏着 Bug ,有的是无法避免的,对于某些不想看到的警告信息,可以通过这个注解来屏蔽。
SuppressWarning 不是一个 marker annotation 。它有一个类型为 String[] 的成员,这个成员的值为被禁止的警告名。对于 javac 编译器来讲,被 -Xlint 选项有效的警告名也同样对 @SuppressWarings 有效,同时编译器忽略掉无法识别的警告名。
2 元注解
元注解的作用就是负责注解其他注解。 Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被用来提供对其它 annotation 类型作说明。 Java5.0 定义的元注解:
1.@Target ,
2.@Retention ,
3.@Documented ,
4.@Inherited
这些类型和它们所支持的类在 java.lang.annotation 包中可以找到。下面一一介绍:
Ø @Target :
@Target 说明了 Annotation 所修饰的对象范围: Annotation 可被用于 packages 、 types (类、接口、枚举、 Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、 catch 参数)。在 Annotation 类型的声明中使用了 target 可更加明晰其修饰的目标。
@Target 作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Target 取值 (ElementType) 有:
1.CONSTRUCTOR: 用于描述构造器
2.FIELD: 用于描述域
3.LOCAL_VARIABLE: 用于描述局部变量
4.METHOD: 用于描述方法
5.PACKAGE: 用于描述包
6.PARAMETER: 用于描述参数
7.TYPE: 用于描述类、接口 ( 包括注解类型 ) 或 enum 声明
Ø @Retention :
@Retention 定义了该 Annotation 被保留的时间长短:某些 Annotation 仅出现在源代码中,而被编译器丢弃;而另一些却被编译在 class 文件中;编译在 class 文件中 Annotation 可能会被虚拟机忽略,而另一些在 class 被装载时将被读取。使用这个 meta-Annotation 可以对 Annotation 的 “ 生命周期 ” 限制。
@Retention 作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
@Retention 取值( RetentionPoicy )有:
1.SOURCE: 在 源文件 中有效(即源文件保留)
2.CLASS: 在 class 文件中有效(即 class 保留)
3.RUNTIME: 在运行时有效(即运行时保留)
Retention meta-annotation 类型有唯一的 value 作为成员,它的取值来自 java.lang.annotation.RetentionPolicy 的枚举类型值。
Ø @Documented:
@Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API ,因此可以被例如 javadoc 此类的工具文档化。 Documented 是一个标记注解,没有成员。
Ø @Inherited :
@Inherited 元注解是一个标记注解, @Inherited 阐述了某个被标注的类型是被继承的。如果一个使用了 @Inherited 修饰的 annotation 类型被用于一个 class ,则这个 annotation 将被用于该 class 的子类。
需要注意的是, @Inherited annotation 类型是被标注过的 class 的子类所继承。类并不从它所实现的接口继承 annotation ,方法并不从它所重载的方法继承 annotation 。
3 自定义 Annotation
自定义 Annotation 表示自己根据需要定义的 Annotation ,定义时需要用到上面的元 Annotation
Ø 自定义注解:
使用 @interface 自定义注解时,自动继承了 java.lang.annotation.Annotation 接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。 @interface 用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、 Class 、 String 、 enum )。可以通过 default 来声明参数的默认值。
定义注解格式:
public @interface 注解名 { 定义体 }
注解参数的可支持数据类型:
1. 所有基本数据类型( int,float,boolean,byte,double,char,long,short)
2.String 类型
3.Class 类型
4.enum 类型
5.Annotation 类型
6. 以上所有类型的数组