认真阅读完这篇文章熟练掌握JAVA关于注解——案例源码分析

举报
桃花键神 发表于 2022/04/17 12:41:43 2022/04/17
【摘要】 认真阅读完这篇文章熟练掌握JAVA关于注解——案例源码分析

1 注解(Annotation)

官方解释:Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

通俗解释:注解就相当于一种规则,在某个类中使用了某个注解,就会触发这种规则。JAVA注解有三种类型,一种是内置注解(JAVA官方定义的注解可以直接用),一种是元注解(注解的注解,用来定义注解类时使用的注解),最后是自定义注解(自定义注解要用到元注解来定义)。元注解就是最底层的注解,用来定义其他注解。

内置注解

Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(或者说 元注解)是:

关键字 用途
all to suppress all warnings(抑制所有警告)
boxing to suppress warnings relative to boxing/unboxing operations(要抑制与箱/非装箱操作相关的警告)
cast to suppress warnings relative to cast operations(为了抑制与强制转换操作相关的警告)
dep-ann to suppress warnings relative to deprecated annotation(要抑制相对于弃用注释的警告)
deprecation to suppress warnings relative to deprecation(要抑制相对于弃用的警告)
fallthrough to suppress warnings relative to missing breaks in switch statements(在switch语句中,抑制与缺失中断相关的警告)
finally to suppress warnings relative to finally block that don’t return(为了抑制警告,相对于最终阻止不返回的警告)
hiding to suppress warnings relative to locals that hide variable(为了抑制本地隐藏变量的警告)
incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)(为了在switch语句(enum案例)中抑制相对于缺失条目的警告)
nls to suppress warnings relative to non-nls string literals(要抑制相对于非nls字符串字面量的警告)
null to suppress warnings relative to null analysis(为了抑制与null分析相关的警告)
rawtypes to suppress warnings relative to un-specific types when using generics on class params(在类params上使用泛型时,要抑制相对于非特异性类型的警告)
restriction to suppress warnings relative to usage of discouraged or forbidden references(禁止使用警告或禁止引用的警告)
serial to suppress warnings relative to missing serialVersionUID field for a serializable class(为了一个可串行化的类,为了抑制相对于缺失的serialVersionUID字段的警告)
static-access o suppress warnings relative to incorrect static access(o抑制与不正确的静态访问相关的警告)
synthetic-access to suppress warnings relative to unoptimized access from inner classes(相对于内部类的未优化访问,来抑制警告)
unchecked to suppress warnings relative to unchecked operations(相对于不受约束的操作,抑制警告)
unqualified-field-access to suppress warnings relative to field access unqualified(为了抑制与现场访问相关的警告)
unused to suppress warnings relative to unused code(抑制没有使用过代码的警告)

元注解

@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented - 标记这些注解是否包含在用户文档中。
@Target - 标记这个注解应该是哪种 Java 成员。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

定义注解

通过几个案例来展示怎么定义注解
案例一:

//标记这些注解是否包含在用户文档中
@Documented
//用于描述域
@Target({FIELD, TYPE})
//运行时保留
@Retention(RUNTIME)
//自定义一个注解
public @interface AnimalUser {
    //注解中包含两个变量,并且初始化
    int id() default 123;

    String name() default "小三";
}
//添加自定义的注解
@AnimalUser
//创建一个用户类
public class User {
    //用户类中的两个属性
    private int id;
    private String name;

}
//创建测试类

public class Demo {

    public static void main(String[] args) throws NoSuchFieldException {
        //反射一个USER对象
        var m = User.class;
        //输出对应字段内容
        System.out.println(m.getAnnotation(AnimalUser.class).name());
        System.out.println(m.getAnnotation(AnimalUser.class).id());


    }
}

案例二

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnimalUser {
    //注解中包含两个变量,并且初始化
    int id() default 123;

    String name() default "小三";
}

//创建一个用户类
public class User {//添加自定义的注解
    @AnimalUser
    private String user;

}
//创建测试类

public class Demo {

    public static void main(String[] args) throws NoSuchFieldException {
        //反射一个USER对象
        var m = User.class;
        //判断类USER中的注解是否含有对应的字段
        var a = m.getDeclaredField("user");
        //输出对应字段内容
        System.out.println(a.getAnnotation(AnimalUser.class).name());
        System.out.println(a.getAnnotation(AnimalUser.class).id());


    }
}

两个案例中的区别
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。