版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者。
https://blog.csdn.net/weixin_43453386/article/details/86064093
Java——》注解
一、注解概念
- 注解(Annotation) = 元数据(Metadata) = 说明注释
- 与 类、接口、枚举 在同一个层次
- 应用于 包、类型、构造方法、方法、成员变量、参数、本地变量
- 以 @interface 关键字定义
- 成员,以无参数的方法的形式被声明
- 方法名 = 成员的名字
- 方法的返回值 = 成员的类型
- 成员赋值是通过
@Annotation(name=value)
的形式 - 注解需要标明注解的生命周期,注解的修饰目标等信息,这些信息是通过元注解实现
二、元注解概念
元注解 = 标记注解 = 注解的注解
1)@Documented:文档注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
2)@Inherited:是否允许子类继承父类的注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
3)@Retention:生命周期注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
4)@Target :修饰目标注解
如果注解的成员变量名称是value,数据类型为数组,以下2种赋值都可以:
数组有多个元素:@Target({ ElementType.ANNOTATION_TYPE } )
数组只一个元素:@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
// ElementType取值
public enum ElementType {
/** 类、接口(包括注解类型)或枚举 */
TYPE,
/** field属性,也包括enum常量使用的注解 */
FIELD,
/** 方法 */
METHOD,
/** 参数 */
PARAMETER,
/** 构造函数 */
CONSTRUCTOR,
/** 局部变量 */
LOCAL_VARIABLE,
/** 注解上使用的元注解 */
ANNOTATION_TYPE,
/** 包 */
PACKAGE
}
三、分类
1、第1种分法
- 内置注解,Java自带的Annotation,如@Override、Deprecated、@SuppressWarnings等;
- 元注解(meta-annotation): @Target、 @Retention、 @Documented、 @Inherited
- 自定义注解,根据需要可以自定义注解,自定义注解需要用到上面的meta-annotation
2、第2种分法
根据注解的生命周期:@Retention
来划分
public enum RetentionPolicy {
/**
* 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃.
* 这意味着:Annotation仅存在于编译器处理期间,编译器处理完之后,该Annotation就没用了
*/
SOURCE,
/**
* 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期.
*/
CLASS,
/**
* 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在,
* 保存到class对象中,可以通过反射来获取
*/
RUNTIME
}
四、注解生命周期
1、RetentionPolicy
public enum RetentionPolicy {
/**
* 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃.
* 这意味着:Annotation仅存在于编译器处理期间,编译器处理完之后,该Annotation就没用了
*/
SOURCE,
/**
* 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期.
*/
CLASS,
/**
* 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在,
* 保存到class对象中,可以通过反射来获取
*/
RUNTIME
}
- RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
- RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
- RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
2、生命周期长度
SOURCE < CLASS < RUNTIME