注解也叫元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在此后的某个时刻很方便的使用这些数据。它与Java代码是独立的,你可以随心所欲的使用注解,前提是你要满足此注解的限制条件。
注解的语法比较简单,除了@符号的使用之外,它基本与Java固有的语法一致。Java SE5内置了三种,定义在java.lang中的注解:
- @Override 表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上覆盖的方法,编译器救护发出错误提示。
- @Deprecated 如果程序员使用了注解为它的元素,那么编译器就会发出警告信息。
- @SuppressWarnings 关闭不当的编译器警告。
还有四个元注解,元注解专职负责注解其他的注解。在jdk8中,@Target新加了ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER。
定义注解
在注解中,一般都会包含一些元素以表示某些值,没有元素的注解称为标记注解,例如下面的Test注解。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
如果含有某些元素,你可以默认该值是什么(但不能是null),如果没有默认值的话,则在使用该注解的时候需要给该属性赋值,元素类型只能是基本数据类型和对应的数组以及注解,下面的代码中由于没有指定array的默认值,所以当你使用该注解的时候必须要给array赋值。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Constraints {
boolean primaryKey() default false;
String name() default "";
int unique() default 0;
Test test() default @Test;
int[] array();
}
读取注解的工具是通过反射和getAnnotation来实现的,另外注解是不支持继承的。Java5中是有apt工具的,但是在Java8中,就移除了。Java8以后不再默认包含APT了,并且相关的资源都被移除了比如Mirror相关类,取而代之的是Pluggable Annotation Processing API。