java中有四种元注解:@Retention、@Inherited、@Documented、@Target
@Retention
注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:
SOURCE:注解仅存在于源码中,在class字节码文件中不包含
CLASS:默认的保留策略,注解在class字节码文件中存在,但运行时无法获得
RUNTIME:注解在class字节码文件中存在,在运行时可以通过反射获取到
@Inherited
声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解
@Documented
声明注解能够被javadoc等识别(下面自定义注解处会有例子做介绍,点击查看)
@Target
用来声明注解范围(枚举ElementType),ElementType可选值:
TYPE:接口、类、枚举、注解
FIELD:字段、枚举的常量
METHOD:方法
PARAMETER:方法参数
CONSTRUCTOR:构造函数
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解
PACKAGE:包
自定义注解经常使用场景:
1.生成文档.例如:@see,@param,@return 等
2.代替配置文件功能.例如spring基于注解的配置
3.在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
不经常使用的场景:
1.类属性自动赋值
2.验证对象属性完整性
@Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Target({ElementType.FIELD,ElementType.METHOD}) @interface MyAnno{ public String name() default "zhangsan"; public String email() default "[email protected]"; }