java一共定义了7个注解。3个在java.Lang下,4个在java.lang.annotation中。
作用在代码上的注解:
@Override:方法重写,如果发现其父类或者引用的接口没有该方法时,会变异报错
@Deprecated:标记方法过时,可以使用但是会出现横线
@suppressWarnings:指示编译器去忽略直接中声明的警告。
作用在注解上的注解(元注解):
@Retention:标识这个注解怎么保存,是旨在代码中还是编入class文件,或者运行时可以通过反射访问
@Document:标记这些注解是否包含在用户文档中
@Target:标记这个注解是那种java成员
@inherited:标记这个注解是继承自那个注解类,(默认是这个注解并没有继承任何子类)
从java7开始,额外增加了3个注解:
@safeVarargs:java7开始支持,忽略任何使用参数为泛型变量的方法或者构造函数产生的警告
@Functionalinterface:java8 开始支持,标识一个匿名函数或者函数式接口
@Repeatable:java8开始支持,标识某注解可以在同一个声明上使用多次
Annotation有三个非常重要的主干类:Annotation,ElementType,RetentionPolicy
Annotation:
package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class extends Annotation> annotationType(); }
ElementType:
package java.lang.annotation; public enum ElementType { TYPE, /* 类、接口(包括注释类型)或枚举声明 */ FIELD, /* 字段声明(包括枚举常量) */ METHOD, /* 方法声明 */ PARAMETER, /* 参数声明 */ CONSTRUCTOR, /* 构造方法声明 */ LOCAL_VARIABLE, /* 局部变量声明 */ ANNOTATION_TYPE, /* 注释类型声明 */ PACKAGE /* 包声明 */ }
RetentionPolicy:
package java.lang.annotation; public enum RetentionPolicy { SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */ CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */ RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */ }
一个自定义注解的组成:
1.@interface:标识为一个注解,并且该注解不能继承其他的注解或者接口
2.@document:表示可以在javadoc中出现
3.@Target(Element.Type):可有可无,若有则只能用于声明他的地方,没有就是用于任何地方
4.@Retention(RetentionPolicy.RUNTIME):将该Annotation保存在.class文件中,并且能被虚拟机读取
注解是和反射搭配着一起实现的