0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JAVA中注解是怎么做到的(上)

jf_78858299 来源:JAVA旭阳 作者:JAVA旭阳 2023-05-11 10:57 次阅读

概述

注解想必大家在项目中经常使用,比如Spring框架中常用的一些注解:@Controller@Service@RequestMapping等等,它是JDK1.5及以后版本引入的一个特性。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。那么你知道JDK什么是元注解吗?注解有哪些分类吗?以及注解在Java中最本质究竟是什么东西,是如何实现的呢?

注解的分类

根据注解的使用场景,主要分为三类,元注解、内置注解和自定义注解。

元注解

用于定义注解的注解,通常用于注解的定义上,标明该注解的使用范围、生效范围等。简而言之,元注解是用来修饰注解的。

@Retention

指定注解信息保留到哪个阶段,分别为源代码阶段、编译Class阶段、运行阶段。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
  • SOURCE: 保留在源代码java中,被编译器丢弃,也就是说在class文件中不包含注解信息,通常用来标记源码,引起大家的注意,比如自定义一个注解例如@ThreadSafe,用来标识一个类时线程安全的。
  • CLASS: 编译后的class文件中包含注解信息,但是会被jvm丢弃
  • RUNTIME: 注解信息在运行期(JVM)保留(.class也有),可以通过反射机制读取注解的信息

@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();
}

具体可选的枚举如下:

public enum ElementType {
    /** 适用范围:类、接口、注解类型,枚举类型enum */
    TYPE,
    /** 作用于类属性 (includes enum constants) */
    FIELD,
    /** 作用于方法 */
    METHOD,
    /** 作用于参数声明 */
    PARAMETER,
    /** 作用于构造函数声明 */
    CONSTRUCTOR,
    /** 作用于局部变量声明 */
    LOCAL_VARIABLE,
    /** 作用于注解声明 */
    ANNOTATION_TYPE,
    /** 作用于包声明 */
    PACKAGE,
    /** 作用于类型参数(泛型参数)声明 */
    TYPE_PARAMETER,
    /** 作用于使用类型的任意语句(不包括class) */
    TYPE_USE
}

@Inherited

加上该注解的注解,表示可以被标注的类子类继承,比如A上标记了带有@Inherited的注解,那么类B继承了A, 那么B也会有这个注解,默认情况下注解是不支持继承的。

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

@Document

将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。

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

@Repeatable

1.8中加入的元注解,用来标记是否可以重复标记。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
    /**
     * Indicates the containing annotation type for the
     * repeatable annotation type.
     * @return the containing annotation type
     */
    Class? extends Annotation value();
}

内置注解

java提供了一些内置注解,可以配合编译器来检查代码的正确性, 我们可以关注他们的元注解。

@Override

标记当前方法是覆写父类的方法。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Deprecated

标记一个元素为已过期,不要在使用了

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

@SuppressWarnings

用来关闭编译器输出的警告信息

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

@FunctionalInterface

java8中引入,标记是一个函数式接口,也就是说有且只有一个抽象方法的接口

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

自定义注解

注解遵循的格式一般如下:

//元注解部分 xxxx
@Retention(xxxx)
@Target(xxxx)
public @interface 注解名 {
  返回值 属性名() 默认值;
  返回值 属性名() 默认值;
}
  • 返回值支持的类型如下:java的8种基础类型(不支持包装类型)、String、Class、Enum、Annotation、以及上面类型的数组。
  • 默认值可选,非必有。

举个项目中自定义的栗子:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented  
@Inherited
public @interface DataAuthorize {
    /**
     * 资产ID
     * @return
     */
    String assetId();

    /**
     * 资产类型
     * @return
     */
    String assetType();

    /**
     * 权限代码
     * @return
     */
    String authCode() default "";

    /**
     * 使用的类型
     * @return
     */
    Class[] useType();
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2916

    浏览量

    103356
  • JDK
    JDK
    +关注

    关注

    0

    文章

    80

    浏览量

    16511
  • spring框架
    +关注

    关注

    0

    文章

    7

    浏览量

    2031
收藏 人收藏

    评论

    相关推荐

    Java中注解的作用

    Annotation 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量
    的头像 发表于 09-30 10:12 530次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>中注解</b>的作用

    如何通过注解来优化我们的Java代码

    Java注解可以说是我们编码过程中最常用的。本篇文章将给大家介绍Java注解的概念、作用以及如何使用注解来提升代码的可读性和灵活性,并介绍如
    的头像 发表于 09-30 11:39 415次阅读

    PCB刻制线圈怎么做到

    `如附图这种PCB刻制线圈是怎么做的,画得这么圆是怎么做到的?`
    发表于 06-13 11:07

    详细介绍了Java泛型、注解、并发编程

    介绍了Java泛型、注解、并发编程、数据传输与序列化、高效IO、容器集合、反射与类加载以及JVM重点知识线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种引用类型、GC 分代收集算法
    发表于 08-20 06:09

    HarmonyOS注解的使用方法分享

    定义我们的注解自定义注解1、声明注解功能:检测类中是否有规范的get方法新建java libray的module,命名为annotation,创建
    发表于 03-28 14:04

    斩波型运放减少噪声 怎么做到的?

    翻译: TI信号链工程师 Tom Wang (王中南) 斩波型运放提供较低的失调电压,同时也极大地减少了1 / f(闪烁)噪声。它是怎么做到的?这篇短文就来讨论这个主题。
    发表于 04-08 04:04 1w次阅读
    斩波型运放减少噪声 <b class='flag-5'>怎么做到</b>的?

    分析java注解基本概念

    什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解
    发表于 09-27 14:53 0次下载

    怎么做到快速修补板式喂料机轴头磨损

    怎么做到快速修补板式喂料机轴头磨损
    发表于 01-23 11:10 2次下载

    注解定义Bean及开发

    注解本质是一个继承了Annotation 的特殊接口,其具体实现类是Java 运行时生成的动态代理类。
    发表于 08-02 10:26 364次阅读

    JAVA中注解怎么做到的(下)

    。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。那么你知道JDK什么是元注解吗?注解有哪些分类吗?以及注解Java中最本质究竟是什么东西,
    的头像 发表于 05-11 10:57 428次阅读
    <b class='flag-5'>JAVA</b><b class='flag-5'>中注解</b>是<b class='flag-5'>怎么做到</b>的(下)

    3分钟纯Java注解搭个管理系统

    Erupt一个通用后台管理框架,据说有 超低代码量 、 零前端代码 、零 CURD操作 、无需建表 ,纯Java注解开发 等特色,号称三分钟就可以搭建一个完整的后台管理系统。
    的头像 发表于 07-28 11:27 579次阅读
    3分钟纯<b class='flag-5'>Java</b><b class='flag-5'>注解</b>搭个管理系统

    怎么做到EMC设计与产品设计同步?(上)

    怎么做到EMC设计与产品设计同步?|深圳比创达EMC(上)
    的头像 发表于 08-28 14:56 330次阅读
    <b class='flag-5'>怎么做到</b>EMC设计与产品设计同步?(上)

    怎么做到EMC设计与产品设计同步?(中)

    怎么做到EMC设计与产品设计同步?(中)相信不少人是有疑问的,今天深圳市比创达电子科技有限公司就跟大家解答一下!
    的头像 发表于 08-29 10:34 317次阅读

    怎么做到EMC设计与产品设计同步?(下)

    怎么做到EMC设计与产品设计同步?|深圳比创达EMC(下)
    的头像 发表于 08-30 10:44 288次阅读

    springmvc常用5种注解

    SpringMVC是一种基于Java的Web框架,使用注解可以更加方便灵活地开发和管理控制器,实现请求的映射和处理。在SpringMVC中,有许多常用的注解,本文将详细介绍其中的五种注解
    的头像 发表于 11-22 16:51 487次阅读