您的位置:首页 > 编程语言 > Java开发

☕ Java注解-笔记

2022-03-20 20:29 543 查看

什么是注解

注解(Annotation)是放在Java源码的类、方法、字段、参数前的一种特殊”注释“。

注释会被编译器直接忽略,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”,一种接口类型。

注解的作用

注解并不能改变程序的运行结果,也不会影响程序运行的性能。有些注解可以在编译时给用户提示或警告,有的注解可以在运行时读写字节码文件信息。

  1. 生成帮助文档。常用有
    @see、@param、 @return
  2. 跟踪代码依赖性,实现替代配置文件功能。(常见的是 Spring 2.5 开始的基于注解配置,作用就是减少配置。)
  3. 在编译时进行格式检查。

常用注解

  • @Override
    :用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素。

  • @Deprecated
    :用来注解类、接口、成员方法和成员变量等,用于表示某个元素(类、方法等)已过时。当其他程序使用已过时的元素时,编译器将会给出警告。

    Java 9 为 @Deprecated 注解增加了以下两个属性:

    forRemoval
    :该 boolean 类型的属性指定该 API 在将来是否会被删除。

  • since
    :该 String 类型的属性指定该 API 从哪个版本被标记为过时。

    public class DeprecatedTest {
    public static void main(String[] args) {
    new Test().print();
    }
    }
    class Test {
    @Deprecated(since="6", forRemoval=true)
    public void print() {
    System.out.println("啊对对对");
    }
    }
  • @SuppressWarnings
    :被该注解修饰的程序元素(及其所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素。

    注解的使用有以下三种:抑制警告关键字

      抑制单类型的警告:
      @SuppressWarnings("unchecked")
    1. 抑制多类型的警告:
      @SuppressWarnings("unchecked","rawtypes")
    2. 抑制所有类型的警告:
      @SuppressWarnings("unchecked")

    使用

    @SuppressWarnings({ "deprecation" })
    注解了HelloWorld.java 的 main 方法:

    程序代码的警告没有了

  • @SafeVarargs
    :用来抑制调用可变参数方法时,提供的参数类型不一致的警告。

    不适用于非 static 或非 final 声明的方法。

  • 定义注解

    public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
    }
    // 注解的参数类似无参数方法

    元注解

    元注解(meta annotation),负责对其它注解进行说明的注解,自定义注解时可以使用元注解。

    • @Target
      :最常用的元注解

      使用

      @Target
      可以定义
      Annotation
      能够被应用于源码的哪些位置:

      类或接口:
      ElementType.TYPE
    • 字段:
      ElementType.FIELD
    • 方法:
      ElementType.METHOD
    • 构造方法:
      ElementType.CONSTRUCTOR
    • 方法参数:
      ElementType.PARAMETER
    // 定义注解@Report用在方法上
    @Target(ElementType.METHOD)
    public @interface Report {
    int type() default 0;
    ...
    }
    
    // 定义注解@Report可用在方法或字段上
    @Target({
    ElementType.METHOD,
    ElementType.FIELD
    })
    public @interface Report {
    ...
    }
  • @Retention

    用于描述注解的生命周期,也就是该注解被保留的时间长短:

    @Retention
    注解中的成员变量(value)用来设置保留策略,value 是
    java.lang.annotation.RetentionPolicy
    枚举类型,
    RetentionPolicy
    有 3 个枚举常量

      仅编译期:
      RetentionPolicy.SOURCE
  • 仅class文件:

    RetentionPolicy.CLASS

      运行期:
      RetentionPolicy.RUNTIME

    如果

    @Retention
    不存在,则该
    Annotation
    默认为
    CLASS
    。通常自定义的
    Annotation
    都是
    RUNTIME
    ,所以必须加上
    @Retention(RetentionPolicy.RUNTIME)
    这个元注解

  • @Inherited

      使用
      @Inherited
      定义子类是否可继承父类定义的注解
    • 仅针对
      @Target(ElementType.TYPE)
      类型的注解有效
    • 且仅针对类的继承,对接口继承无效
    • 子类默认也定义父类的注解

    定义注解完整步骤

    1. 用@interface定义注解
    2. 添加参数、默认值
    3. 用元注解配置注解
    // 3. 用元注解配置注解
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Report {  // 1. 用@interface定义注解
    // 2. 添加参数、默认值
    int type() default 0;
    String level() default "info";
    String value() default "";
    }

    注解分类

    根据注解是否包含成员变量,可以分为如下两类。

    1. **标记注解:**没有定义成员变量的注解类型被称为标记注解。这种注解仅利用自身的存在与否来提供信息,如前面介绍的 @Override、@Test 等都是标记注解。
    2. **元数据注解:**包含成员变量的注解,因为它们可以接受更多的元数据,所以也被称为元数据注解。

    抑制警告关键字

    关键字 用途
    all 抑制所有警告
    boxing 抑制装箱、拆箱操作时候的警告
    cast 抑制映射相关的警告
    dep-ann 抑制启用注释的警告
    deprecation 抑制过期方法警告
    fallthrough 抑制在 switch 中缺失 breaks 的警告
    finally 抑制 finally 模块没有返回的警告
    hiding 抑制相对于隐藏变量的局部变量的警告
    incomplete-switch 忽略不完整的 switch 语句
    nls 忽略非 nls 格式的字符
    null 忽略对 null 的操作
    rawtypes 使用 generics 时忽略没有指定相应的类型
    restriction 抑制禁止使用劝阻或禁止引用的警告
    serial 忽略在 serializable 类中没有声明 serialVersionUID 变量
    static-access 抑制不正确的静态访问方式警告
    synthetic-access 抑制子类没有按最优方法访问内部类的警告
    unchecked 抑制没有进行类型检查操作的警告
    unqualified-field-access 抑制没有权限访问的域的警告
    unused 抑制没被使用过的代码的警告
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: