注解Annotation
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后的某个时刻非常方便地使用这些数据。
概念
Annotation在一定程度上是把元数据和源代码文件结合在一起,而不是保存在外部文档中这一大的趋势之下所催生的。从JDK5.0开始引入。
-
Annotation的作用:
不是程序本身,可以对程序作出解释。(这一点和注释comment相同)
可以被其他程序(比如编译器)读取
-
Annotation的格式:
-
注解是以“@注解名”在代码中存在的,还可以添加一些参数值,例如:
@SuppressWarnings(value = "unchecked")
-
-
Annotation的使用范围:
可以附加在package,class,method,field等上,相当于给它们添加了额外的辅助信息,可以通过反射机制访问这些元数据
内置注解(定义在java.lang中的注解)
@Override,表示当前的方法定义将覆盖超类中的方法。
@Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息
-
@SuppressWarnings,关闭不当的编译器警告信息。在Java SE5之前的版本中,也可以使用该注解,不过会被忽略不起作用
@SuppressWarnings("all")
@SuppressWarnings("unchecked")
@SuppressWarnings(value = {"unchecked", "deprecation"})
等等
此注解需要添加一个参数才能使用,这些参数都是已经定义好了的
元注解
Java目前只内置了三种标准注解,以及四种元注解。元注解专职负责注解其他的注解:
@Target 表示该注解可以用于什么地方。可能的ElementType参数包括:
CONSTRUCTOR:构造器
FIELD:域(包括enum实例)
LOCAL_VARIABLE:局部变量
METHOD:方法
PACKAGE:包
PARAMETER:参数
TYPE:类、接口(包括注解类型)或enum
@Retention 表示需要在什么级别保存该注解信息。可选的RententionPolicy参数包括:
SOURCE:注解将被编译器丢弃
CLASS:注解在class文件中可用,但会被JVM丢弃
RUNTIME:JVM将在运行期也保留注解,因此可以通过反射机制读取注解的信息
@Documented 将此注解包含在Javadoc中
@Inherited 允许子类继承父类中的注解。
自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口。
例:
import java.lang.annotation.* //元注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Test { //注解元素: 类型 + 元素名 + (); String value(); String name() default ""; int age() default 0; }
说明:
可以通过default来声明元素的默认值
如果只有一个注解元素,一般元素名为value。这样做的好处是给value赋值时可以省略value =
注解元素必须要有值,定义注解时,经常使用空字符串、0、-1作为默认值
目前只简单了解,更加深入(比如编写注解处理器)可以看Thinking in java第20章