背景知识:
从JDK5开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范。注释是以“@注释名”在代码中存在的,还可以添加一些参数
值,例如:@SuppressWarnings(value="unchecked")。注释可以附加在package, class, method,
field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。如果没有外部解析工具等对其加以解析和处理的情
况,本身不会对Java的源代码或class文件等产生任何影响,也不会对它们的执行产生任何影响。
元数据的作用,大致可分为三种:编写文档,通过代码里标识的元数据生成文档;代码分析,通过代码里标识的元数据对代码进行分析;编译检查,通过代码里标识的元数据让编译器能实现基本的编译检查。
JDK5内置的基本注释
JDK5内置了一些常用的注释,可以在编译时帮我们捕获部分编译错误,及提示信息,下面介绍下这些注释的用法:
1、
@Override定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。如果方法
利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。例如我们为某类重写toString()方法却写成了tostring(),并
且我们为该方法添加了@Override注释;代码如下:
Java代码
1. public class OverrideDemo {
2. @Override
3. public String tostring() {
4. return super.toString();
5. }
6. }
在编译时,会提示以下错误信息:
@Override
^1 错误
4. }
8. public static void DeprecatedMethod() {
注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
DeprecatedDemo.java:6: 警告:[deprecation] SomeClass 中的 DeprecatedMethod() 已过时
SomeClass.DeprecatedMethod();
^1 警告
2.import java.util.ArrayList;
3.public class SuppressWarningsDemo {
4. public static List cache = new ArrayList();
5. //@SuppressWarnings(value = "unchecked")
6. public void add(String data) {
7. cache.add(data);
8. }
9.}
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
@SuppressWarnings("unchecked");
同时参数value可以取多个值如:
@SuppressWarnings(value={"unchecked", "deprecation"})
或@SuppressWarnings({"unchecked", "deprecation"})。
因为annotation类型是一个非凡的接口,所以它与接口之间存在着某些差异:
A. Annotation类型使用关键字@interface而不是interface,这个关键字声明隐含了一个信息,它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface。
B.
Annotation类型的方法定义是独特的、受限制的,方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了
成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面
类型之一作为元素的一维数组。方法的后面可以使用default和一个默认数值来声明成员的默认值,null不能作为成员默认值,这与我们在非
annotation类型中定义方法有很大不同。
C. Annotation类型又与接口有着近似之处,它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。
2、自定义注释的实例:
下面,我们将看到如何定义annotation类型的例子。它展示了annotation类型声明以及
2.
3.import java.lang.annotation.*;
4./**
5.* 使用annotation来描述那些被标注的成员是不稳定的,需要更改
6.*/
7.public @interface Unstable {
8.}
Java代码
2.* 使用Author这个annotation定义在程序中指出代码的作者
3.*/
4.public @interface Author {
5. /** 返回作者名 */
6. String value();
7.}
2.* Reviews annotation类型只有一个成员,
3.* 但是这个成员的类型是复杂的:由Review annotation组成的数组
4.*/
5.@Retention(RetentionPolicy.RUNTIME)
6.public @interface Reviews {
7. Review[] value();
8.}
9./**
10.* Review annotation类型有3个成员:
11.* 枚举类型成员grade、
12.* 表示Review名称的字符串类型成员Reviewer、
13.* 具有默认值的字符串类型成员Comment。
14.*/
15.public @interface Review {
16. //内嵌的枚举类型
17. public static enum Grade { EXCELLENT, SATISFACTORY, UNSATISFACTORY };
18. //下面的方法定义了annotation的成员
19. Grade grade();
20. String reviewer();
21. String comment() default "";
22.}
Java代码
2. Class[] value();
3.}
@Target的用法:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。 例如,以下这个注释只能用来声明方法:
Java代码
2. public @interface MyAnnotation {
3. ...
4. }
Java代码
2. public @interface MyAnnotation {
3. ...
4. }
@Inherited的用法:指示注释类型自动被子类继承。 Inherited也是一个没有成员的注释。
注意,如果使用@Inherited注释类以外的任何事物都是无效的。还要注意,此元注释仅对从超类继承注释有效;对已实现接口的注释无效。