本章目标
了解Annotation的作用
掌握系统内建的三个Annotation
Annotation
J2SE 5.0提供了很多新的特性。其中的一个很重要的特性,就是对元数据(Metadata)的支持。在J2SE5.0中,这种元数据称为注释(Annotation)。通过使用注释, 程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。
Annotation可以用来修饰类、属性、方法,而且Annotation不影响程序运行,无论是否使用Annotation代码都可以使用正常的执行。
Annotation接口
java.lang.annotation.Annotation是Annotation的接口,只要是Annotation都必须实现此接口,此接口定义如下:
public interface Annotation { public Class<? extends Annotation> annotationType(); //返回此 annotation 的注释类型 public boolean equals(Object obj); public int hashCode(); String toString(); }
系统内建的Annotation
在JDK 1.5之后,系统中已经建立了如下的三个内建的Annotation类型,用户直接使用即可。
——@Override:覆写的Annotation
——@Deprecated:不赞成使用的Annotation
——@SuppressWarnings:压制安全警告的Annotation
@Override
@Override主要是在方法覆写的时候使用,用于保证方法覆写的正确性。下面先来看一下此注释的基本使用。
观察@Override注释的作用
class Person{//定义 Person 类 public String getInfo(){//定义 getInfo() 方法 return "这是一个 Person 类。";//返回信息 } } class Student extends Person{//子类继承父类 @Override//此处明确地指出方法覆写操作 public String getInfo(){//覆写父类的方法 return "这是一个 Student 类"; } } public class OverrideAnnotationDemo01 { public static void main(String[] args) { Person per = new Student();//通过子类实例化父类对象 System.out.println(per.getInfo());//输出信息 } /* 结果: * 这是一个 Student 类 * */ }
错误的覆写
class Person{//定义 Person 类 public String getInfo(){//定义 getInfo() 方法 return "这是一个 Person 类。";//返回信息 } } class Student extends Person{//子类继承父类 @Override//此处明确地指出方法覆写操作 public String getinfo(){//此处将方法名称写错 return "这是一个 Student 类"; } } public class OverrideAnnotationErrDemo01 { public static void main(String[] args) { Person per = new Student();//通过子类实例化父类对象 System.out.println(per.getInfo());//输出信息 } /* 结果: * 这是一个 Person 类。 * */ }
@Deprecated
@Deprecated注释的主要功能,是用来声明一个不建议使用的方法。如果在程序中使用了此方法的话,则在编译时将出现警告信息。
使用@Deprecated声明一个不建议使用的方法
class Demo{//定义 Demo 类 @Deprecated//声明不建议使用的操作 public String getInfo(){//此方法不建议用户使用 return "这是一个 Person 类。";//返回信息 } } public class DeprecatedAnnotationDemo01 { public static void main(String[] args) { Demo d = new Demo();//实例化 Demo 对象 System.out.println(d.getInfo());//编译时,将出现警告信息 } /* 结果: * 这是一个 Person 类。 * */ }
在类声明中使用@Deprecated注释
@Deprecated//定义不建议的操作 class Demo{//此类不建议用户使用 public String getInfo(){//取得信息 return "这是一个 Person 类。";//返回信息 } } public class DeprecatedAnnotationDemo02 { public static void main(String[] args) { Demo d = new Demo();//编译时,将出现警告信息 System.out.println(d.getInfo());//输出信息 } /* 结果: * 这是一个 Person 类。 * */ }
@SuppressWarnings
@SuppressWarnings注释的主要功能是用来压制警告,例如,之前讲解泛型操作的时候,如果在一个类声明时没有指明泛型的话,则肯定在编译时将产生,那么此时就可以使用@SuppressWarnings压制住这种警告。
压制一个警告
class Demo<T>{//定义 Demo 类,使用泛型 private T var;//定义泛型变量 public T getVar() {//取得泛型变量的内容 return var; } public void setVar(T var) {//设置泛型变量 this.var = var; } } public class SupperssWarningsAnnotationDemo01 { @SuppressWarnings("unchecked")//压制主方法的警告信息 public static void main(String[] args) { Demo d = new Demo();//编译时,将出现警告信息,但此时警告被压制 d.setVar("chaoyi"); System.out.println("内容:"+d.getVar());//输出 } /* 结果: * 内容:chaoyi * */ }
压制多个警告
@Deprecated // 以下操作不建议使用 class Demo<T>{ // 定义Demo类,使用泛型 private T var ; // 定义泛型变量 public T getVar() { // 取得泛型变量的内容 return var; } public void setVar(T var) { // 设置泛型变量 this.var = var; } } public class SuppressWarningsAnnotationDemo02 { @SuppressWarnings({ "unchecked", "deprecation" })// 此时,压制两条警告 public static void main(String[] args) { Demo d = new Demo() ; // 编译时的警告信息将被压制 d.setVar("chaoyi") ; System.out.println("内容:"+d.getVar()) ; // 输出 } /*结果: * 内容:chaoyi * */ }
在设置注释信息的时候,是以keyàvalue的形式出现的,所以以上的@SuppressWarnings也可以直接使用“value={"unchecked',"deprecation'}”的方式设置
另一种形式的@SuppressWarnings
@Deprecated // 以下操作不建议使用 class Demo<T>{ // 定义Demo类,使用泛型 private T var ; // 定义泛型变量 public T getVar() { // 取得泛型变量的内容 return var; } public void setVar(T var) { // 设置泛型变量 this.var = var; } } public class SuppressWarningsAnnotationDemo02 { @SuppressWarnings(value = { "unchecked", "deprecation" })// 此时,压制两条警告 public static void main(String[] args) { Demo d = new Demo() ; // 编译时的警告信息将被压制 d.setVar("chaoyi") ; System.out.println("内容:"+d.getVar()) ; // 输出 } /*结果: * 内容:chaoyi * */ }