前言
@Target
、@Retention
、@Documented
、@Inherited
注解都是作用在注解上的注解,java把他们亲切的叫做元注解,这四个注解正是Java的四大元注解。
@Target注解
@Target
注解算是比较常见的注解了,@Target
注解用于描述注解的使用范围,优雅的说就是使用了@Target
去定义一个注解,那么可以决定定义好的注解能用在什么地方。
为了显得身临其境的效果,我们可以先进@Autowired
注解看看
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
我想各位都应该很清楚@Autowired
注解的用法了,这个时候我们再来分析分析@Target
注解的用法。
内部值:ElementType[] value()
数组, value
值类型 ElementType
枚举类型,元注解中的枚举值决定了,一个注解可以标记的范围
TYPE
: 类型上面 用于描述类、接口(包括注解类型) 或enum
声明
FIELD
: 用于描述字段
METHOD
:方法
PARAMETER
: 参数 【参数名】
CONSTRUCTOR
: 构造方法
LOCAL_VARIABLE
: 局部变量
ANNOTATION_TYPE
: 可以打在注解上面
PACKAGE
:可以打在包上面
TYPE_PARAMETER
: 参数类型【形式参数类型】
TYPE_USE
: 任何位置都可以
这时应该更能清晰的看出,@Autowired
注解用于描述注解的使用范围了~
@Retention
@Retention也是开发中经常用到注解
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
@Retention
:用于描述一个注解存在的生命周期,主要包括源码,字节码文件,运行时。
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
1、RetentionPolicy.SOURCE
:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS
:注解被保留到class文件,但jvm加载class文件时候被遗弃【默认】
3、RetentionPolicy.RUNTIME
:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Document
@Document
注解较少用,简单了解即可。
该注解主要判断是否可以生成到 API文档中 ==》即生成API文档的时 检验
@Inherited
这是一个稍微复杂的注解类型. 它指明被注解的类会自动继承. 更具体地说,如果定义注解时使用了 @Inherited
标记,然后用定义的注解来标注另一个父类, 父类又有一个子类(subclass),则父类的所有属性将被继承到它的子类中.
@Inherited
表示一个【注解】能够被继承,不是说注解与注解之间能否相互继承,而是说:一个类A被注解了,那么另外一个类B,继承了A类B类能够继承到A类中,的注解 (即被@Inherited
注解过的注解)
总结
1.
@Target
:用于描述注解的使用范围
2.@Retention
:用于描述注解的生命周期【源代码阶段、CLASS文件中有效、运行时有效】
3.@Documented
:表示该注解是否可以生成到 API文档中。注意:@Documented
是一个标记注解,没有成员。
4.@Inherited
:使用@Inherited定义的注解具备继承性 假设一个注解在定义时,使用了@Inherited
,然后该注解在一个类上使用,如果这个类有子类,那么通过反射我们可以从类的子类上获取到同样的注解。