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

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


一、注解的作用

注解可以分为三类:

1、内置注解(由编译器使用的注解),如:

  • @Override:让编译器检查该方法是否正确地实现了覆写;
  • @SuppressWarnings:告诉编译器忽略此处代码产生的警告。

这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了。

2、由工具处理.class文件使用的注解,比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能。这类注解会被编译进入.class文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。

3、在程序运行期能够读取的注解,它们在加载后一直存在于JVM中,这也是最常用的注解。例如,一个配置了@PostConstruct的方法会在调用构造方法后自动被调用(这是Java代码读取该注解实现的功能,JVM并不会识别该注解)。

二、注解的定义

元注解

有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。Java标准库已经定义了一些元注解,我们只需要使用元注解,通常不需要自己去编写元注解。

@Target

定义注解能够被应用于源码的哪些位置

// 定义注解 @Report 可用在方法上
@Target(ElementType.METHOD)
public @interface MyAnnotation1 {
    int type() default 0;
    String level() default "info";
    String value() default "";
}

// 定义注解 @Report 可用在方法或字段上
@Target({
    ElementType.METHOD,
    ElementType.FIELD
})
public @interface MyAnnotation2 {
    ...
}
@Retention

定义注解的生命周期,默认为 CLASS,使用最多一般是 RUNTIME

  • 仅编译期:RetentionPolicy.SOURCE
  • 仅class文件:RetentionPolicy.CLASS
  • 运行期:RetentionPolicy.RUNTIME
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    int type() default 0;
    String level() default "info";
    String value() default "";
}
@Repeatable

定义注解是否可重复

@Repeatable(Reports.class)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
    int type() default 0;
    String level() default "info";
    String value() default "";
}
@Inherited

定义子类是否可继承父类定义的注解

@Inherited
@Target(ElementType.TYPE)
public @interface MyAnnotation {
    int type() default 0;
    String level() default "info";
    String value() default "";
}

定义注解

格式:

public @interface xxx {...}
  1. @interface 定义注解
  2. 添加参数、默认值
  3. 用元注解配置注解
// 用元注解配置注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
// 用 @interface 定义注解
public @interface MyAnnotation {
    // 注解的参数
    int type() default 0;
    String level() default "info";
    String value() default "";
}
  • 定义一个注解时,还可以定义配置参数。配置参数可以包括:基本类型、String、Class、枚举类型。
  • 可以使用 default 来声明参数的默认值
  • 最常用的参数定义为value(),推荐所有参数都尽量设置默认值
  • 必须设置@Target@Retention@Retention一般设置为RUNTIME,便于运行期读取该注解

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

10 条评论

  1. ixsahvzlfb
    ixsahvzlfb

    弹头奇兵

  2. myaqsacwqw
    myaqsacwqw

    阿努贾

  3. zqyygrejoz
    zqyygrejoz

    BamBam南希姐妹的故事

  4. rnfavwrldb
    rnfavwrldb

    所有错误的配料

  5. wambtrvjuo
    wambtrvjuo

    下班后

  6. rjyjkicjbv
    rjyjkicjbv

    独行月球

  7. qzamdddppp
    qzamdddppp

    你的文章让我学到了很多知识,非常感谢。 http://www.55baobei.com/EHqluG3Bnu.html

  8. kvvitsqcam
    kvvitsqcam

    看到你的文章,我仿佛感受到了生活中的美好。 https://www.4006400989.com/qyvideo/52620.html

  9. wshvzgsdrq
    wshvzgsdrq

    不错不错,我喜欢看 https://www.ea55.com/

  10. oaegpyzuil
    oaegpyzuil

    不错不错,我喜欢看 https://www.jiwenlaw.com/

添加新评论