Java - 注解

1. 注解简介

1.1 什么是注解

注解(Annotation):Java注解用于为Java代码提供元数据,是从JDK5.0开始引入的新技术。

注解的位置:Java源码的类、方法、字段、参数前,作为一种特殊“注释”。

注解的作用:用于帮助我们更快捷的写代码。

元数据:元数据用于对数据进行说明(一种标识),Annotation就是Java的元数据。

1.2 注解分类

1.2.1 内建注解

有三个注解在java.lang包下,提供了编译检查的作用。

注解说明
@Override只能标注方法,检查该方法是否是重写方法
@Deprecated标注内容不在被建议使用(删除线)
@SuppressWarnings编译器将忽略标注内容产生的警告

1.2.2 元注解

这些注解是作用在其他注解的注解。

注解说明
@Retention标注该注解类型的注解保留时长
@Documented标注该注解的内容将出现在javadoc中
@Target标注该注解属于那种Java成员
@Inherited标注该注解是继承于哪个注解类

1.2.3 自定义注解

除了可以使用已经提供的注解外,我们也可以通过@interface自定义注解。

2. Annotation组成

java.lang.annotation包的组成如下:

image-20211009095429416

其中我们需要关注的有RetentionPolicyElementType

2.1 RetentionPolicy

该类与Retention元注解类型一起使用,以指定Annotation要保留多长时间。(单选值)

RetentionPolicy类的内容如下:

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

SOURCE:标注Annotation在编译器处理期间将被丢弃。

CLASS:默认,注解将由编译器记录在类文件中,但运行时VM不保留注解。

RUNTIME:运行时注解保留在VM中,可通过反射性地读取注解。

2.2 ElementType

该类与Target元注解类型一起使用,以指定Annotation所适用的程序元素类型。(多选值)

ElementType类的内容如下:

public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}

TYPE :类、接口(包括注释类型)或枚举声明

FIELD:字段声明(包括枚举常量)

METHOD:方法声明

PARAMETER:参数声明

CONSTRUCTOR:构造声明

LOCAL_VARIABLE:局部变量声明

ANNOTATION_TYPE:注解类型声明

PACKAGE:包声明

TYPE_PARAMETER:参数类型声明

TYPE_USE:类型使用

3. 内建注解

3.1 @Override

定义在java.lang.Override中,此注释只使用于修辞方法,表示一个方法声明打算重写超类中的另一个方法的声明。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

@Override
public String toString() {
    return "Test01_NJ{}";
}

该注解类的内容如下:

import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

3.2 @Deprecated

使用@Deprecated注解标注内容不在被建议使用(删除线),但一样会运行被标注的方法。

image-20211009103443197

该注解类的内容如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

3.3 @SuppressWarnings

使用@SuppressWarnings注解时,编译器将忽略标注内容产生的警告(右边黄线)。

image-20211009104507604

该注解类的内容如下:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

4. 元注解

4.1 @Retention

使用@Retention注解,标识Annotation类型的注解保留的时长(作用域)。当注解类型声明中没有@Retention元注解,则默认保留策略为RetentionPolicy.CLASS

选型(单选):SOURCE,CLASS,RUNTIME

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{ }

该注解类的内容如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

4.2 @Documented

类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。

@Documented
@interface MyAnnotation{ }

该注解类的内容如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

4.3 @Target

通过 @Target 注解,标识该Annotation类型的所适用的程序元素类型。

选型(多选):TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,TYPE_PARAMETER, TYPE_USE

@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
@interface MyAnnotation{ }

该注解类的内容如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

4.4 @Inherited

通过 @interface 注解,标识该注解将具有继承性。当使用了@Inherited注解后,该Annotation的子类将自动继承注解

@Inherited
@interface MyAnnotation{ }

该注解类的内容如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

5. 自定义注解

除了可以使用已经提供的注解外,我们也可以通过@interface自定义注解。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
  • 设置默认值:自定义注解时,通过default设置默认值。(默认为-1时,表示不存在)

  • 返回值类型:基本类型、Class,String,Enums。

  • 如果只有一个参数成员,一般参数名为value

⚠️注意:注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值。

// 自定义注解如下
// 适用于方法,RUNTIME
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    String name() default "";
    int age() default 0;
    int id() default -1;
    String[] games() default {"game1","game2"};
}
// 在方法上使用该注解
// 注解中,通过可以属性名赋值
@MyAnnotation(name = "张三")
public void test(){}

6. 写在最后

使用注解时必须使用@符号!

学习注解是为了够更好的看懂注解。

 


❤️ END ❤️

t 0;
int id() default -1;
String[] games() default {“game1”,“game2”};
}


```java
// 在方法上使用该注解
// 注解中,通过可以属性名赋值
@MyAnnotation(name = "张三")
public void test(){}

6. 写在最后

使用注解时必须使用@符号!

学习注解是为了够更好的看懂注解。

 


❤️ END ❤️
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值