注解
Table of Contents
从 Java 1.5 开始,Java 增加了对元数据的支持,也就是注解。
注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译、类加载和运行时被读取,并执行相应的处理。开发人员可以通过注解在不改变原有代码逻辑的情况下在源代码中嵌入补充信息。
简介
从 Java 1.5 开始可以在源代码中嵌入一些补充信息,这种补充信息称为 注解 (Annotation)。
注解是 Java 平台中非常重要的一部分,它是以 @
开头的,如方法重写时使用过的 @Override
。注解并不能改变程序的运行结果,也不会影响程序运行的性能。有些注解可以在编译时给用户提示或警告,有的注解可以在运行时读写字节码文件信息。
注解可以用元数据这个词来描述,即一种描述数据的数据,所以可以说注解就是源代码的元数据。
1: @Override 2: public String toString() { 3: return "C 语言中文网"; 4: }
上述代码中,如果不使用 @Override
注解标记代码,程序也能够正常执行。那为什么还要使用呢?有什么好处?
事实上,使用 @Override
注解就相当于告诉编译器这个方法是一个重写方法,如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法(可以防止不小心拼写错误造成麻烦)。
注解常见的作用有以下几种:
- 生成帮助文档。这是最常见的,也是 Java 最早提供的注解,常用的有
@see、@param
和@return
等; - 跟踪代码依赖性,实现替代配置文件的功能。比较常见的是 Spring 2.5 开始的基于注解配置,作用就是减少配置;
*注:现在的框架基本都使用了这种配置来减少配置文件的数量。
- 在编译时进行格式检查。如把
@Override
注解放在方法前,就能检查出这个方法是不是重写了父类方法。
无论是哪一种注解,本质上都是一种数据类型,是一种接口类型。
到 Java 8 为止,Java 8 提供了 11 个内置注解,其中有 5 个基本注解,它们来自 java.lang
包;有 6 个是元注解,来自于 java.lang.annotaion
包,自定义注解会用到元注解。
*注:元注解就是负责注解其他注解的注解。
基本注解
基本注解包括: @Override、@Deprecated、@SuppressWarnings、@SafeVarargs
和 @FunctionalInterface
。
@Override
Java 中 @Override
注解是用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素,它可以强制一个子类必须重写父类方法或者实现接口的方法。
@Deprecated
Java 中 @Deprecated
可以用来注解类、接口、成员方法和成员变量等,用于表示某个元素(类、方法等)已过时。当其他程序使用已过时的元素时,编译器将会给出警告。
Java 9 为 @Deprecated
注解增加了以下两个属性:
forRemoval
:该 boolean 类型的属性指定该 API 在将来是否会被删除;since
:该 String 类型的属性指定该 API 从哪个版本被标记为过时。
1: class Test { 2: @Deprecated(since = "9", forRemoval = true) 3: public void print() { 4: System.out.println("这里是 C 语言中文网!"); 5: } 6: } 7: 8: public class Deprecated { 9: public static void main(String[] args) { 10: // 下面使用 print() 方法时会被编译器警告 11: new Test().print(); 12: } 13: }
注: @Deprecated
的作用与文档注释中的 @deprecated
标记的作用基本相同,但它们的用法不同,前者是 Java 5 才支持的注解,无须放在文档注释语法( /** ... */
部分)中,而是直接用于修饰程序中的程序单元,如方法、类和接口等。
@SuppressWarnings
i.e. 抑制编译器警告
Java 中的 @SuppressWarnings
注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一起作用于该程序元素的所有子元素。
例如,使用 @SuppressWarnings
修饰某个类取消显示某个编译器警告,同时又修饰该类里的某个方法取消显示另一个编译器警告,那么该方法将会同时取消显示这两个编译器警告。
通常情况下,如果程序中使用没有泛型限制的集合将会引起编译器警告,为了避免这种编译器警告,可以使用 @SuppressWarnings
注解来消除这些警告。
注解的使用有以下三种:
- 抑制单类型的警告:
@SuppressWarnings("unchecked")
; - 抑制多类型的警告:
@SuppressWarnings("unchecked", "rawtypes")
; - 抑制所有类型的警告:
@SuppressWarnings("all")
。
1: public class HelloWorld { 2: @SuppressWranings({"deprecation"}) 3: public static void main(String[] args) { 4: Person p = new Person(); 5: p.setNameAndAge("C 语言中文网", 20); 6: p.name = "Java Tutor"; 7: } 8: }
上述代码第 2 行使用 @SuppressWarnings({ "deprecation" })
注解了 main
方法,抑制过期方法警告。
TODO @SafeVarargs
TODO @FunctionalInterface
TODO 元注解作用及使用
元注解包括 @Documented、@Target、@Retention、@Inherited
和 @Repeatable、@Native
等 6 个注解,这些注解都可以在 java.lang.annotation
包中找到。