注解的基础
- 注解的定义
用@interface表示 - 元注解
java.lang.annotation提供了四种元注解,专门注解其他的注解。分别为@Retention、@Target、@Document、@Inherited - @Retention——注解的生命周期
- @Retention(RetentionPolicy.SOURCE):在编译阶段丢弃,仅存在于源码中。在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
- @Retention(RetentionPolicy.CLASS):类加载时被丢弃,默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。
- @Retention(RetentionPolicy.RUNTIME):始终不会被丢弃,注解会在class字节码文件中存在,在运行时可以通过反射获取到。我们自定义的注解通常使用这种方式。
- @Target——注解的作用目标
@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) // 包 - @Document——表示是否将注解信息添加在javadoc中
- @Inherited——定义该注释和子类的关系
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
意思就是:一个子类想获取到父类上的注解信息,那么必须在父类上使用的注解上面加上@Inherited关键字编写规则
自定义注解类编写的一些规则:- Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.
- 参数成员只能用public或默认(default)这两个访问权修饰
- 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
- 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法
- 注解也可以没有定义成员
PS:自定义注解需要使用到元注解自定义注解实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface FruitColor {
/**
* 颜色枚举
*/
public enum Color{ BLUE,RED,GREEN};
/**
* 颜色属性
*/
Color fruitColor() default Color.GREEN;
}
1 | //注解的使用 |