zoukankan      html  css  js  c++  java
  • java注解与自定义注解

    注解简介

    注解(Annontation),Java5引入的新特性,位于java.lang.annotation包中。提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。是一种说明、配置、描述性的信息,与具体业务无关,也不会影响正常的业务逻辑。但我们可以用反射机制来进行校验、赋值等操作。

    常见的注解:@Override,@author,@param,@Deprecated,@SuppressWarnings

    注解的常见用途

    • 生成文档的注解,如@author,@param。
    • 跟踪代码依赖性,实现替代配置文件功能,如spring mvc的注解。
    • 编译时进行格式检查,如@override。
    • 编译时进行代码生成补全,如lombok插件的@Data。

    注解基础知识

    注解的定义
    • 注解的定义通过@interface表示,所有的注解会自动继承java.lang.Annotation接口,且不能再继承别的类或是接口。
    • 注解的成员参数只能用public或默认(default) 访问权修饰来进行修饰。
    • 成员参数只能使用八种基本类型(byte、short、char、int、long、float、double、boolean)和String、Enum、Class、annotations等数据类型,及其数组。
    • 获取类方法和字段的注解信息,只能通过Java的反射技术来获取 Annotation 对象。
    • 注解可以没有定义成员,只做标识。
    元注解

    元注解是专门用来注解其他注解的注解,听起来有些绕口,实际上就是专门为自定义注解提供的注解。java.lang.annotation提供了四种元注解:

    • @Documented – 注解是否将包含在JavaDoc中
    • @Retention – 什么时候使用该注解
    • @Target – 注解用于什么地方
    • @Inherited – 是否允许子类继承该注解
    • @Repeatable - 是否可重复注解,jdk1.8引入
    注解的生命周期

    通过@Retention定义注解的生命周期,格式如下:

    @Retention(RetentionPolicy.SOURCE)
    

    其中RetentionPolicy的不同策略对应的生命周期如下:

    • RetentionPolicy.SOURCE : 仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中。@Override, @SuppressWarnings都属于这类注解。
    • RetentionPolicy.CLASS : 默认策略,在class字节码文件中存在,在类加载的时被丢弃,运行时无法获取到。
    • RetentionPolicy.RUNTIME : 始终不会丢弃,可以使用反射获得该注解的信息。自定义的注解最常用的使用方式。

    注解的作用目标

    通过@Target定义注解作用的目标,比如作用于类、属性、或方法等,默认可用于任何地方。格式如下:

    @Target(ElementType.TYPE)
    

    对应ElementType参数值适用范围如下:

    • ElementType.TYPE: 类、接口、注解、enum
    • ElementType.CONSTRUCTOR: 构造函数
    • ElementType.FIELD: 成员变量、对象、属性、枚举的常量
    • ElementType.LOCAL_VARIABLE: 局部变量
    • ElementType.METHOD: 方法
    • ElementType.PACKAGE: 包
    • ElementType.PARAMETER: 参数
    • ElementType.ANNOTATION_TYPE): 注解
    • ElementType.TYPE_PARAMETER:类型参数,表示这个注解可以用在 Type的声明式前,jdk1.8引入。
    • ElementType.TYPE_USE:类型的注解,表示这个注解可以用在所有使用Type的地方(如:泛型,类型转换等),jdk1.8引入。
    Documented

    @Documented,表示是否将此注解的相关信息添加到javadoc文档中。

    Inherited

    @Inherited,定义该注解和子类的关系,使用此注解声明出来的自定义注解,在使用在类上面时,子类会自动继承此注解,否则,子类不会继承此注解。注意,使用Inherited声明出来的注解,只有在类上使用时才会有效,对方法,属性等其他无效。

    实例

    下面通过一个实例来演示注解的使用:通过注解进行赋值和通过注解进行校验。

    见: https://github.com/mint31sd/javase/tree/0a1891d3ddf9ae4ff783f360f8a2972fbdcbc658/reflect/src/main/java/any/mint/annotation

  • 相关阅读:
    java位运算
    java笔试题(面试题)系列之一
    Java数据类型转换总结
    ++a和a++
    Java IO
    Java 并发
    Java位运算及补码存储
    Redis 5.0.0安装部署(伪集群版)
    Redis 安装(单机版)
    Dubbo源码分析系列之【服务暴露】
  • 原文地址:https://www.cnblogs.com/mintsd/p/13063091.html
Copyright © 2011-2022 走看看