注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,注解的语言比较简单,除了@符号的使用之外,它基本与Java固有的语法一致。java内置了三种注解,定义在java.lang中:
- @Override:表示当前的方法定义将覆盖超类中的方法。
- @Deprecated:如果程序员使用了注解为它的元素,那么编译器会发出警告信息。
- @SuppressWarnings:关闭不当的编译器警告信息。
-
定义注解
注解的定义和接口的定义很像,事实上,与其他任何Java接口一样,注解也将会编译成class文件。
@Documented
@Inherited
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.METHOD )
public @interface Permission{
boolean validate() default true;
String permissionKey();
}
从以上代码可以看出,除了@符号之外,@Permission的定义很像一个空的接口。定义注解时,会需要一些元注解,如@Target和Retention。
-
元注解
java不仅提供了三种标准注解(上文所见),还提供了四种元注解。元注解专职负责注解其他的注解:
@Target:表示该注解可以用于什么地方,其中的ElementType参数包括:
-
CONSTRUCTOR:构造器的声明
-
FIELD:域声明(包括enum实例)
-
LOCAL_VARIABLE:局部变量声明
-
METHOD:方法声明
-
PACKAGE:包声明
-
PARAMETER:参数声明
-
TYPE:类、接口(包括注解类型)或enum声明
-
ANNOTATION_TYPE:注解类型声明
-
TYPE_PARAMETER:键入参数声明
-
TYPE_USE:使用类型
-
@Retention:表示需要在什么级别保存该注解信息,其中RetentionPolicy参数包括:
- SOURCE:注解将被编译器丢弃
- CLASS:注解在class文件中可用,但会被JVM丢弃
- RUNTIME:JVM在运行时期也保留注解。
@Documented:将此注解包含在Javadoc中。
@Inherited:允许子类继承父类中的注解。
大多数时候,都是自己定义自己所需要的注解,并编写自己的处理器来处理注解。
-
注解元素
注解元素可用的类型如下所示:
所有基本类型(int,float,boolean等)
String
Class
enum
Annotation
数组
注:不允许使用任何包装类型。
其实注解定义很简单,关键在于要使用注解做什么,以及处理注解的处理器。