注解(Annotation)是Java5开始引入的新特性。他提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
注解将信息存储于Annotation的name=value这样的结构对中。注解并不会影响程序代码的执行,注解的添加与删除不会影响到程序的正常执行。另外,虽然一些注解通过java的反射、api在方法运行时被访问,而java语言解释器在工作时忽略了这些注解。正是由于java虚拟机忽略了注解,导致了注解类型在代码中是不起作用的。只有通过某些特殊的工具才能对java中的注解进行访问和处理。
注解其实是一种接口,通过java反射机制相关的api来访问注解信息、相关类级框架和工具当中的类。根据这些相关信息来决定如何使用这些程序元素或者改变他们的行为。
注解一般被作为一种辅助途径,应用在软件框架或者工具当中。在这些工具类总根据不同的注解信息来采取不同的处理过程,或者改变相应的程序元素。
Annotation(注解)和Interface(接口)有什么相同和不同之处呢?
- 注解类型是使用关键字@Interface而不是Interface。这个关键字声明隐含了一个信息,他是继承了java.lang.annotation.annotationInteface而不是声明了一个接口。
- 注解类型方法定义是独特的受限的。注解类型的方法必须声明成无参数,无异常抛出的。这些方法定义了注解的成员,方法名成为了成员名,而方法返回值则成为了成员的类型。null不能作为成员的默认值。
- 注解和接口都可以定义常量,静态成员类型。
Java标准注解介绍:
从Java5版本开始,自带了三种标准注解类型:
- Override:被用作标注方法,说明了标注的方法重载了父类的方法,起到了断言(assert)的作用。
- Deprecated:当一个类型或者类型成员使用了此注解@deprecated的话,编译器将不鼓励这种被标注的程序元素。
- SuppressWarnings:此Annotation能够告诉java编译器关闭对类、方法以及成员变量的警告。
Java元注解介绍:
Java元注解就是用来注解其他注解的注解。Java5.0定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明,Java5.0定义的元注解有以下四种类型:
- @Target
- @Retention
- @Documented
- @Inherited
接下来分别介绍下各个元注解:
1.@Target
@Target主要作用是用于描述注解的使用范围,即被描述的注解可以用在什么地方。
@Target的使用范围:
- CONSTRUCTOR:用来描述构造器
- FIELD:用来描述域
- LOCAL_VARIABLE:用于描述局部变量
- METHOD:用于描述方法
- PACKAGE:用于描述包
- PARAMETER:用于描述参数
- TYPE:用于描述类、接口、以及枚举声明等
2.@Retention
@Retation主要表示需要在什么级别保存该注解信息,用于描述注解的生命周期,即被描述的注解在什么范围内是有效的。
@Retention的取值:
- SOURCE:在源文件当中是有效的,即在源文件当中保留
- CLASS:在class当中有效,即在class当中保留
- RUNTIME:在运行时候是有效的,即在运行时被保留
3.@Documented
@Documented用于描述其他类型的annotation应该被作为被标注的程序成员的公共API,因此可以被javadoc此类的工具文档化。@Documented是一个标记注解,没有任何成员。
4.@Inherited
@Inherited元注解是一个标记注解,@Inherited阐述了某个被标注的类是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用与该class的子类。