本章目标
了解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
三种内定的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
* */
}
@SuppressWarnings中的关键字
在设置注释信息的时候,是以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
* */
}