从零开始的JAVA学习笔记(八):注解

注解Annotation

Annotation注解是JDK5之后引入的代码修饰器类、方法、变量、参数和包等都可以被其标注Annotation可以通过reflect(反射)获取标注内容同时可以被写入到字节码中

1. 名词解释

单词词性/中文含义
Annotatev.注释、注解
Annotationn.注解、注释、评论用来声明注解,其本身是注解类
reflectv.反应、反射、思考反射包
Elementn.元素、成分声明注解的作用域
ElementTypen.元素类型Element元注解的枚举参数
Retentionn.保留、保存声明注解生命周期
RetentionPolicyn.保留政策Retention元注解的枚举参数
AutomicAnnotationn.元注解用来声明注解的注解

2. 内置注解

Java中默认定义了一套注解共有 7 个,3 个在java.lang 中,剩下 4 个为元注解java.lang.annotation中,在JDK8种又额外引入的3个内置注解,目前内置注解共10个

2.1 默认注解

Java.lang中定义的默认注解用于代码检查

注解含义描述
@Override重写声明在重写或实现的方法上,用来告知编译器进行代码检查
@Deprecated过时被其声明的方法,编译器会进行检查并报编译警告(或删除线)
@SuppressWarnings抑制警告类或方法上声明指示编译器去忽略被声明区域的警告

2.2 元注解

元注解是用来定义注解的注解,在java.lang.annotation

注解含义描述
@Retention保留声明注解保存周期(只在代码中还是编入字节码,或在运行时依然存在并可以通过反射访问)若没有 @Retention,则默认是 RetentionPolicy.CLASS
@Documented文档标记注解是否包含在用户文档中(JavaDoc默认不包含注解)
@Target目标标记注解可以作用于那些Java成员,若不使用该注解,则其可以用在任何地方
@Inherited继承标记注解是具有继承性(被该注解标注的成员的子类也具有该注解

2.3 JDK8注解

注解含义描述
@SafeVarargs安全参数忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
@FunctionalInterface函数接口标识一个匿名函数方法或函数式接口
@Repeatable重复标识注解可以在同一个成分上使用多次

3. 声明注解

所有的注解都是Annotation的实现类使用@interface标注则实现了java.lang.annotation.Annotation接口表明现在定义的是一个Annotation注解

  • 每一个Anootation都必须和一个RetentionPolicy相关联,定义该注解的保存策略
  • 至少与一个ElementType关联,定义注解作用域

注解关系如下图
在这里插入图片描述

3.1 自定义注解

  • 使用@interface来声明注解(默认实现Annotation接口)

  • 注解的成员变量以无参数方法的形式来声明,其方法名就是属性名类型为其返回值,作为注解的配置参数

  • 注解的参数类型只能是基本数据类型StringClassenumAnnotation五种类别

  • 可以使用**default来初始化属性默认值**,否则必须赋值

  • 若属性名称为value,当只使用value时可以省略

  • 若注解没有属性,则其被称为标识,用来标记可以用来检查

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyComprehension {

    // 枚举类型的
    Color color() default Color.RED;

    // 默认类型,不加default是必填项目,可以省略value,若为一个可以省略{}
    String[] value();

    // 注解类型 默认用一个注解填充
    MyAnnotation annotation() default @MyAnnotation("Comprehensive");

}

3.2 ElementType作用域

ElementType元注解Element的参数的枚举类,用来定义注解的作用域(可以在那些成员上生效)

对象含义描述
TYPE类型可以使用在类、接口(包括注释类型)或枚举声明类上
FIELD字段可以使用在字段声明上(包括枚举常量)
METHOD方法可以使用在方法声明上
PARAMETER参数可以使用在形参声明
CONSTRUCTOR构造可以使用在构造器声明上
LOCAL_VARIABLE局部变量可以使用在局部变量声明上
ANNOTATION_TYPE注解类型可以使用在注解类型声明上
PACKAGE
TYPE_PARAMETER泛型类型可以使用在泛型类型声明
TYPE_USE类型使用可以使用在泛型使用前类型强转括号类型前异常抛出异常前

3.3 RetentionPolicy生命周期

RetentionPolicy元注解Retention参数的一个枚举类,用来定义其注解生命周期(注解将保留生效至何时)

对象含义描述
SOURCE资源注解信息仅存在于编译之前,编译成字节码后就不在保留该注解信息
CLASS字节码编译后注解将存储于类对应的字节码文件中(默认为此)
RUNTIME运行时编译后注解不仅储存于字节码文件中,还可以被JVM加载读取

4. 注解的使用

java.lang.Class中定义了一些有关注解的方法,用于操作被注解定义的类,可以通过反射的方式获取类的类对象(C.class),并对其注解进行检查进行流程处理**(只有生命周期为RUNTIME的注解才能处理)**

方法含义描述
C.isAnnotationPresent(A.class)是否包含判断C类是否含有指定注解A
C.getAnnotation(A.Class)获取注解获取C类指定A注解的对象
C.getAnnotations()获取全部获取C类的全部注解
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值