注解介绍以及定义 Annotation
元注解:
元注解的作用就是用来描述其他注解的。Java5.0定义了4个标准的元数据类型,它们用来对提供注解类型做说明。
(1)@Target
(2)@Retetion
(3)@Documented
(4)@Inherited
@Target
- 作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Target说明了注解所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
- 取值(ElementType的取值)可多个
举例 | 描述 |
---|---|
@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) | 包 |
@Target(ElementType.TYPE)
public @interface Annotation {
String value() default "test";
}
@Retention
- 作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
- 取值 生命周期周期长度 SOURCE < CLASS < RUNTIME,即前者能作用的地方后者一定也能作用
举例 | 描述 |
---|---|
@Retention(RetentionPolicy.SOURCE) | 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃 |
@Retention(RetentionPolicy.CLASS) | 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期 |
@Retention(RetentionPolicy.RUNTIME) | 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 |
例如: @Override只是做一些检查性的操作 它的类型就是CLASS
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String value() default "test";
}
@Documented
- 作用:这个注解只是用来标注生成javadoc的时候是否会被记录
在自定义注解的时候可以使用@Documented来进行标注,如果使用@Documented标注了,在生成javadoc的时候就会把@Documented注解给显示出来。
@Inherited
- 作用:在注解上使用@Inherited 表示该注解会被子类继承,注意,仅针对类,成员属性、方法并不受此注释的影响
对于类来说,子类要继承父类的注解需要该注解被 @Inherited 标识。
对于成员属性和方法来说,非重写的都会保持和父类一样的注解,而被实现的抽象方法,和被重写的方法都不会有父类的注解。
/**
* @author Admin
* 只有一个参数时,使用时可以不写参数名
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Deprecated
public @interface Annotation {
String value() default "test";
}