四大源注解
所有关于注解的文章都绕不开这四个注解,我们也不例外
@Target
@Retention
@Documented
@Inherited
接下来就一个个的介绍
首先是 @Target
这个注解用来标志当前定义的注解是打在哪个位置的,比如类上,方法上,字段上,可以写多个
通过源码我们可以看到内部是一个数组,所有可以写多个
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*数组表示此属性可以写多个值
*/
ElementType[] value();
}
它可以使用的值有以下这些
ElementType是一个枚举类内部就是上面列举出的几个属性当然,也可以不用这个枚举,直接写字符串效果是一样的
那么他们分别代表什么呢
TYPE:类、接口(包括注解类型) 或enum声明。
FIELD:字段声明(包括enum常量).,也就是打在字段上
METHOD:方法声明。
PARAMTER:形式参数声明。,方法的形参上
CONSTRUCTOR:构造函数声明。constructort上
LOCAL_VARIABLE:局部变量声明。方法内变量
ANNOTATION_TYPE:注解类型声明。打在注解上
PACKAGE:包声明
TYPE_PARAMETER:参数类型声明
TYPE_USE:使用一个类型,详见:java.lang.annotation.ElementType
@Retention 注解
指的是注解的生命周期
即会保留到哪个阶段。
SOURCE:源码级别保留,编译后即丢弃。
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
@Documented 注解
能被javadoc此类的工具文档化 无值
@Inherited注解
当你想让你的自定义注解被继承时,可以使用这个注解,也没有参数取值