1、基本语法
注解是 Java 5 所引入的众多语言变化之一,是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,包含在 java.lang.annotation 包中
注解的语法十分简单,只要在现有语法中添加 @ 符号即可,java.lang 包提供了如下五种注解:
-
@Override
表示当前的方法定义将覆盖基类的方法,如果你不小心把方法签名拼错了,编译器就会发出错误提示
-
@Deprecated
如果使用该注解的元素被调用,编译器就会发出警告信息,表示不鼓励程序员使用
-
@SuppressWarnings
关闭不当的编译器警告信息
-
@SafeVarargs
禁止对具有泛型可变参数的方法或构造函数的调用方发出警告
-
@FunctionalInterface
声明接口类型为函数式接口
2、定义注解
注解的定义看起来和接口的定义很像,事实上它们和其他 Java 接口一样,也会被编译成 class 文件
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {}
除开 @ 符号, @Test 的定义看起来更像一个空接口。注解的定义也需要一些元注解,元注解用于注解其他的注解
注解 | 解释 |
---|---|
@Target | 表示注解可以用于哪些地方。可能的 ElementType 参数包括: CONSTRUCTOR:构造器的声明 FIELD:字段声明(包括 enum 实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类型)或者 enum 声明 |
@Retention | 表示注解信息保存的时长。可选的 RetentionPolicy 参数包括: SOURCE:注解将被编译器丢弃 CLASS:注解在 class 文件中可用,但是会被 VM 丢弃 RUNTIME:VM 将在运行期也保留注解,因此可以通过反射机制读取注解的信息 |
@Documented | 将此注解保存在 Javadoc 中 |
@Inherited | 允许子类继承父类的注解 |
@Repeatable | 允许一个注解可以被使用一次或者多次(Java8) |
不包含任何元素的注解称为标记注解,上例中的 @Test 就是标记注解。注解通常也会包含一些表示特定值的元素,当分析处理注解的时候,程序可以利用这些值。注解的元素看起来就像接口的方法,但可以为其指定默认值
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id();
String description() default "no description";
}
....
public class TestUtils {
// 在方法上使用注解 @TestAnnotation
@UseCase(id = 47, description = "description")
public void test() {
...
}
}
注解元素可用的类型如下所示,如果使用了其他类型,编译器就会报错:
-
所有基本类型(int、float、boolean 等)
-
String
-
Class
-
enum
-
Annotation
-
以上类型的数组
如果没有给出 description 的值,在分析处理这个类的时候会使用该元素的默认值。元素的默认值不能有