JAVA 元注解 @Target @Retention @Documented @Inherited

JAVA 元注解 @Target @Retention @Documented @Inherited
一、元注解

JDK1.5起提供了四个元注解,即@Target,@Retention,@Document,@Inherited。所谓的元注解就是注解的注解的意思,如果我们在开发过程中需要自定义注解以满足需求,我们自定义的注解就需要被元注解修饰,比如我们新自定义CreateAnnotation注解

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CreateAnnotation {

}
1. @Target
// 单参数
@Target({ ElementType.METHOD })
// 多参数
@Target(value = {ElementType.METHOD,ElementType.TYPE})

@Target注解用于定义注解的使用位置,如果没有该注解,表示注解可以用于任何地方
@Target的ElementType取值有以下类型:

  • TYPE:类,接口或者枚举
  • FIELD:域,包含枚举常量
  • METHOD:方法
  • PARAMETER:参数
  • CONSTRUCTOR:构造方法
  • LOCAL_VARIABLE:局部变量
  • ANNOTATION_TYPE:注解类型
  • PACKAGE:包
2. @Retention

@Retention注解用于指明修饰的注解的生存周期,即会保留到哪个阶段。格式为:

@Retention(RetentionPolicy.RUNTIME)

RetentionPolicy的取值包含以下三种:

  • SOURCE:源码级别保留,编译后即丢弃。
  • CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
  • RUNTIME:运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
3. @Documented

指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。

4. @Inherited

@Inherited注解用于标注一个父类的注解是否可以被子类继承,如果一个注解需要被其子类所继承,则在声明时直接使用@Inherited注解即可。如果没有写此注解,则无法被子类继承。下面做一个测试:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//如果父类使用了InHeritedApplication注解,则子类应该继承
@Inherited
@interface InHeritedApplication {
}
 
//父类使用了@InHeritedApplication注解
@InHeritedApplication
class Animal {
 
}

class Dog extends Animal{
 
}

则 Student类也有@HeritedApplication

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页