基本注解
5个基本注解:
- @Override:用来指定方法覆载的,它可以强制一个子类必须覆盖父类的方法。(只能修饰方法,不能修饰其它元素)
- @Deprecated:用于表示某个程序元素已过时,当其它程序使用已过时的类,方法时,编译器将会给出警告。
- @Suppress Warnings:指示被该Annotation修饰的程序元素(以及该程序元素中的所有子元素)取消指定的编译器警告。
- @Safe Varargs(Java7新增):它是Java7专门为抑制“堆污染”警告提供的。
- @FunctionalInterface(Java8新增):用来指定某个接口必须是函数式接口。
元Annotation
使用@Retention
@Retention只能用于修饰Annotation定义,用于指定被修饰的Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的value成员变量。
value的成员变量:
RetentionPolicy.CLASS:编译器把Annotation记录在class文件中。当运行java程序是,JVM不可获取Annotation信息。这是默认值。
RetentionPolicy.RUNTIME:编译器把Annotation记录在class文件中。当运行java程序是,JVM也可获取Annotation信息,程序可以通过反射获取该Anntation信息。
RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器直接丢弃这种Annotation。
使用@Target
@Target也只能修饰一个Annotation定义,它用于指定被修饰的Annotation能用于修饰哪些程序单元。@Target也包含一个value的成员变量。
value的成员变量:
ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation。
ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器。
ElementType.FIELD:指定该策略的Annotation只能修饰成员变量。
ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量。
ElementType.METHOD:指定该策略的Annotation只能修饰方法定义。
ElementType.PACKAGE:指定该策略的Annotation只能修饰包定义。
ElementType.PARAMETER:指定该策略的Annotation可以修饰参数。
ElementType.TYPE:指定该策略的Annotation可以修饰类、接口或枚举定义。
使用@Documented
@Documented用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档,如果定义Annotation类时使用了@Documented修饰,则所有使用该Annotation修饰的程序员元素的API文档中将会包含该Annotation说明。
使用@Inherited
@Inherited元Annotation指定被它修饰的Annotation将具有继承性——如果某个类使用了@xxx注解(定义该Annotation时使用了@Inherited修饰)修饰,则其子类将自动被@xxx修饰。
自定义Annotation
定义新的Annotation类型使用@interface关键字定义一个新的Annotation类型与定义一个接口非常像,如下可定义一个简单的Annotation类型。
public @interface Test{
}
Annotation还可以带成员变量,Annotation的成员变量在Annotation定义中以无形参的方法来声明。