贰拾壹——给编译器看的注解
Annotation( 注解 )功能建立在反射机制之上,通过这个功能可对程序进行注释操作。
一、Annotation 的含义
Annotation( 中文翻译为 “ 注解 ”,或 “ 注释 ” )实际上表示的是一种注释的语法,这种注释和代码的注释是不一样的,代码的注释( 如单行注释用双斜杠 “ // ”,多行注释用 “ /*...*/ 等 ” )是给程序员看的,其主要目的是增加代码的可读性,便于代码的后期维护。而 Annotation,主要是服务于编译器,属于一种配置信息。早期的 Java 程序提倡程序与配置文件相分离,代码是代码,注释是注释。但后来的实践发现,配置文件过多,以至于配置信息修改起来非常困难,所以将配置信息直接写入到程序之中的理念又重新得到应用。
而若想要在 Java 中完成这样的功能,就需要使用 Annotation。在流行的 SSH 框架( 即:Spring——开源的 Java/Java EE 全功能栈的情况及的应用程序框架,Struts2——用于开发 Java EE 网络应用程序的开源 Web 应用框架,Hibernate——Java 语言下的对象关系映射解决方案,它对 JDBC 进行了轻量级的对象封装,是一种数据库持久层框架 )等中大量使用了这个技术。
在本质上,Annotation 提供了一种与程序元素关联任何信息或者任何元数据( metadate )的方式。Annotation 可以像修饰符一样被使用,可以应用于任何程序元素( 如包、类型、构造方法、方法、成员变量、参数、本地变量 )的声明中。这些信息被存储在 Annotation 的 “ name = value ” 结构对中。事实上,Annotation 类型是一种接口,能够通过 Java 反射 API( 应用程序接口 )的方式提供对其信息的访问。
二、系统内建的 Annotation
在 JDK 1.5 之后的系统中,内建了 3 个 Annotation:@Override、@Deprecated、@SuppressWarnings。
1.@Override
如果要进行方法的覆写,那么要求是:方法名称、参数的类型及个数完全相同,而在开发之中有可能会由于手误等原因导致方法不能被正确地覆写。
举例:
//由于手误,导致覆写错误
class Message
{
public String tostring() //原本打算覆写toString()
{
return "Hello";
}
}
public class OverrideError
{
public static void main(String[] args)
{
System.out.println(new Message());
}
}
原本打算覆写 toString() 方法,却由于手误导致覆写 “ 错误 ”——tostring(),其中的 S 字符被错误小写,而 Java 是区分大小写的,这时不会产生编译错误,因为 JDK 会认为 tostring() 是一个新的方法,可是从实际需求上来讲,这个方法应该是被覆写的。因此为了保证这种错误在程序编译的时候就可以被发现,可以在方法覆写时增加上 “ @Override ” 注解。@Override 用在方法之上,就是用来告诉编译器,这个方法是用来覆写来自父类的同名方法的,如果父类没有这个所谓的 “ 同名 ” 方法,就会发出警告信息。
//使用@Override Annotation
class Message
{
@Override
public String tostring() //原本打算覆写toString()
{
return "Hello";
}
}
public class OverrideError
{
public static void main(String[] args)
{
System.out.println(new Message());
}
}
这样就可以在编译时发生编译错误( 使用 Eclipse 会有错误提示 ),提示 :" 类型为 Message 的方法 tostring() 必须覆盖或实现超类型方法 "。这样添加了注解,就可以及时在编译时就发现错误,并提示用户早点改正错误,以防日后维护困难。
如果将注解提示的错误纠正过来,将 s 字符改为 S 字符,就完成了真正的覆写。
2.@Deprecated
在 API 中经常会看到某个方法下面有 “ Deprecated ” 这个单词,表示这个方法已经过时,不建议使用,如 Sring 类的构造方法中就有这样一个方法。
String(byte[] ascii,int hibyte)
这个过时的方法并不能将多个字节准确地转换为字符,自从 JDK 1.1 起,完成该转换的首选方法是通过 String 构造方法,该方法接受一个字符集名称或使用平台的默认字符集。