@Target->用于标注注解使用的位置
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
属性 | 描述 | 备注 |
---|---|---|
@Target(ElementType.TYPE) | 接口、类、枚举、注解 | |
@Target(ElementType.FIELD) | 字段、枚举的常量 | |
@Target(ElementType.METHOD) | 方法 | |
@Target(ElementType.PARAMETER) | 方法参数 | |
@Target(ElementType.CONSTRUCTOR) | 构造函数 | |
@Target(ElementType.LOCAL_VARIABLE) | 局部变量 | |
@Target(ElementType.ANNOTATION_TYPE) | 注解 | |
@Target(ElementType.PACKAGE) | 包 |
@Retention->定义被它所注解的注解保留多久
生命周期长度 SOURCE < CLASS < RUNTIME
属性 | 描述 | 备注 |
---|---|---|
@Retention(RetentionPolicy.SOURCE) | 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略 | 只是做一些检查性的操作 |
@Retention(RetentionPolicy.CLASS) | 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期 | 在编译时进行一些预处理操作 |
@Retention(RetentionPolicy.RUNTIME) | 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 | 在运行时去动态获取注解信息 |
@Documented->生成文档信息的时候保留注解,对类作辅助说明
使用javadoc命令生成文档信息:javadoc -d ${file} 时,如果加了@Documented注解,则生成的文档上会有注解,如果没有加注解@Documented,生成的文档则没有注解
@Inherited->如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解
注意:
1.接口用上个@Inherited修饰的注解,其实现类不会继承这个注解
2.父类的方法用了@Inherited修饰的注解,子类也不会继承这个注解