【Java进阶系列】注解

⚡️1 注解的理解

①注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。

②和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。

③在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等。

⚡️2 基本的 Annotation 介绍

使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素

🧐三个基本的 Annotation

  1. @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
  2. @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
  3. @SuppressWarnings: 抑制编译器警告

⚡️3 @Override 注解的案例

override:限定某个方法,是重写父类方法,该注解只能用于方法

//override:限定某个方法,是重写父类方法,该注解只能用于方法
class Father {
    public void fly() {
        System.out.println("Father fly.….");
    }
}
class Son extends Father {
    @Override //说明
    public void fly() {
        System.out.println("Son fly..");
    }
}

🧐解读:

  1. @Override 注解放在 fly 方法上,表示子类的fly 方法时重写了父类的 fly
  2. 这里如果没有写 @Override 还是重写了父类 fly
  3. 如果你写了@Override 注解,编译器就会去检查该方法是否真的重写了父类的方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误.
  4. 看看@Override的定义(源码)
    解读: 如果发现 @interface 表示一个 注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

😲补充说明:@interface的说明
@interface不是interface是注解类是jdk5.0之后加入的

🐱‍🏍Override使用说明

  1. @Override表示指定重写父类的方法((从编译层面验证),如果父类没有fly方法,则会报错
  2. 如果不写@Override注解,而父类仍有public void fly(){},仍然构成重写
  3. @Override只能修饰方法,不能修饰其它类,包,属性等等
  4. 查看@Override注解源码为@Target(ElementType.METHOD),说明只能修饰方法
  5. @Target是修饰注解的注解,称为元注解,记住这个概念.

⚡️4 @Deprecated 注解的案例

@Deprecated: 用于表示某个程序元素(类, 方法等)已过时。

public class Deprecated_ {
    public static void main(String[] args) {
        A a = new A();
        a.hi();
        System.out.println(a.n1);
    }
}
@Deprecated
class A {
    @Deprecated
    public int n1 = 10;
    @Deprecated
    public void hi(){
    }
}

在这里插入图片描述

🧐解读:

  1. @Deprecated 修饰某个元素, 表示该元素已经过时
  2. 即不再推荐使用,但是仍然可以使用
  3. 查看 @Deprecated 注解类的源码
  4. 可以修饰方法,类,字段, 包, 参数 等等
  5. @Deprecated 可以做版本升级过渡使用
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

⚡️5. @SuppressWarnings 注解的案例

@SuppressWarnings: 抑制编译器警告

all,抑制所有警告
想了解更多?请参考视频:韩顺平Java

import java.util.ArrayList;
import java.util.List;


@SuppressWarnings("all")
public class SuppressWarnings_ {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("mary");
        int i;
        System.out.println(list.get(1));
    }
    public void f1() {
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("mary");
        int i;
        System.out.println(list.get(1));
    }
}

⚡️6 JDK 的元 Annotation(元注解)

6.1 元注解的基本介绍

JDK 的元 Annotation 用于修饰其他 Annotation

6.2 元注解的种类

  1. Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME

  2. Target // 指定注解可以在哪些地方使用

  3. Documented //指定该注解是否会在 javadoc 体现

  4. Inherited //子类会继承父类注

6.3 @Retention

6.3.1 说明

只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值

6.3.2 @Retention 的三种值
  1. RetentionPolicy.SOURCE: 编译器使用后,直接丢弃这种策略的注释
  2. RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
  3. RetentionPolicy.RUNTIME:编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注解
6.3.3 一个@Retention的案例
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)//这个就是@retention的取值
public @interface Override {
    
}

说明

  1. Override 的作用域在SOURCE,当编译器编译时生效,不会写入到.class文件,也不会在runtime(运行时)生效

  2. @interface不是interface,是注解类是jdk5.0之后加入的

6.3.4 @Retention的源码在这里插入图片描述

6.4 @Target

6.4.1 基本说明

用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素,@Target也包含一个名为value的成员变量。

6.4.2 案例
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD,LOCAL VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE})
public @interface Deprecated {

}
6.4.3 @Target的源码说明
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

ElementType源码:

package java.lang.annotation;

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}

6.5 @Documented

6.5.1 基本说明

@Documented:用于指定被该元 Annotation 修饰的Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。
说明:定义为Documented的注解必须设置Retention值为RUNTIME。

6.5.2 案例
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE,METHOD, PACKAGE,PARAMETER, TYPE)
public @interface Deprecated { 
//一个Deprecated 注解@Documented,则javadoc会看到Deprecated
}
6.5.3 @Document源码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_ TYPE)
public @interface Documented {
}

6.6 @Inherited

被它修饰的Annotation将具有继承性.如果某个类使用了被@lnherited修饰的Annotation,则其子类将自动具有该注解
说明:实际应用中,使用较少,了解即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值