Java——》注解

版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者。
https://blog.csdn.net/weixin_43453386/article/details/86064093

一、注解概念

  • 注解(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

五、Java SE5内置了三种标准注解

1、@Deprecated:废弃的,过时的

2、@Override :重写、覆盖

3、@SuppressWarnings :压缩警告

猜你喜欢

转载自blog.csdn.net/weixin_43453386/article/details/86064093