注解的声明
注解的声明与接口类似,只不过在interface前面要加一个@,注解(@interface)是一种定义类型,它是在JDK 5.0中引入的。注解也存在成员变量,但是与类不同的是注解是没有方法的。
/**
* 定义一个注解
*/
public @interface MyAnnotation {
//注解的成员变量,没有方法
String name();
int age();
}
注解还可以给变量定义默认值,如果注解的变量已经被默认值,在使用的时候可以不为注解的成员变量赋值,而是直接使用默认值。
/**
* 定义一个注解
*/
public @interface MyAnnotation {
//注解的成员变量,没有方法
//赋默认值
String name() default "Annotation";
int age() default 18;
}
注解的分类
根据注解是否包含成员变量,可以将Annotation分为两类:
- 标记注解
标记注解是指没有包含成员变量的注解。例如Java内置的注解@Override注解
- 元数据注解
元数据注解指的是包含成员变量的注解,这类注解可以接受更多的元数据。
元注解
元注解可以理解为注解的注解。用来提供对给其他注解类型做说明的。JDK中提供了如下4元注解
@Target
@Retention
@Documented
@Inherited
@Target注解
指定Annotation用于修饰哪些程序元素。@Target也包含一个名为'' value''的成员变量,该value成员变量类型为ElementType[],该类型是枚举类型,值有如下几个:
public enum ElementType {
TYPE,//能修饰类,接口和枚举类型
FIELD,//能修饰成员变量
METHOD,//能修饰方法
PARAMETER,//能修饰参数
CONSTRUCTOR,//能修饰构造器
LOCAL_VARIABLE,//能修饰局部变量
ANNOTATION_TYPE,//能修饰注解
PACKAGE,//能修饰包
/**
* 1.8之后增加了两个
*/
TYPE_PARAMETER,//能使用修饰自定义的参数
TYPE_USE//能使用在使用类型的任意语句中
}
使用实例:该注解只能使用在成员变量和方法中
@Target({ElementType.METHOD,ElementType.FIELD})
public @interface MyAnnotation {
//注解的成员变量,没有方法
//赋默认值
String name() default "Annotation";
int age() default 18;
}
@Retention
这个注解定义了该注解可以保留多长的时间,某些注解仅出现在源代码中,而被编译器丢弃,另一些且被编译在class文件中等。@Retention的值'value'可以决定该注解保留的时间,在使用@Retention的时候一定要指定value的值。value的值有以下这些:
public enum RetentionPolicy {
/**
* Annotations只保留在源代码中.
*/
SOURCE,
/**
* 编译器把Annotation记录在class文件中,当运行Java程序时,
* JVM中不在保留该Annotation
*/
CLASS,
/**
* 编译器把Annotation记录在class文件中,当运行Java程序时,
* 并且JVM中保留该Annotation,可以通过反射获取Annotation的值
*/
RUNTIME
}
@Documented
@Documented是一个标记注解,如果定义注解中使用了@Documented修饰定义,则在用javadoc命令生成API文档后,所有使用注解MyAnnotation修饰的程序元素,将会包含注解MyAnnotation的说明。
@Inherited
@Inherited是一个标记注解,指定注解具有继承性。要注意的是它并不是说注解本身可以继承,而是说如果一个父类被@Inherited注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了父类的注解。
参考链接:https://blog.csdn.net/qq_20521573/article/details/82054088









网友评论