Java实现自定义注解

news2024/11/14 22:54:04

前言

(1)Java实现自定义注解其实很简单,跟类定义差不多,只是属性的定义可能跟我们平时定义的属性略有不同,这里会给大家详解,先来看代码:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
    String message() default "";
    int[] nums();
}

上面代码就实现了一个自定义注解实现自定义注解需要最少指定两个基本条件①注解的作用范围②注解的生命周期,那这两个范围怎么指定呢?这个问题问的很好,指定这两个条件,就需要使用到了Java为我们提供的元注解(所谓的元注解:其实就是Java官网自己定义的注解,作用在注解上,并且为这个注解赋予了含义,当编译器扫描到这个注解时,就知道该注解是什么作用!)


(2)看到这里要注意的是,上面 message() 和 nums()  可能跟我们定义方法有点类似,但是,它不是方法!它不是方法!它不是方法!重要的事情讲三遍,它是java注解自定义属性的规则(可能很多人疑惑也就是在这个点上!)

    String message() default "";

上面表示的是定义一个 String 类型的 message属性,默认值为 ""

注解自定义属性的格式为: 属性类型 属性名称();

其中默认值可以写可以不写,如果需要给这个属性默认值,那么就使用 default 值 来为这个属性赋予默认值。这样就已经完成了自定义注解。


(3)刚才我们说过,需要自定义注解,最少指定两个基本条件:①注解的作用范围②注解的生命周期,那么就需要用到元注解,Java为我们提供了四个元注解,作用如下:

注解作用
@Target指定注解作用范围(比如说:该注解是作用在类上,还是方法,或者是属性上等等)
@Retention指定注解的生命周期(也就是注解的保留时间,是在编译器有效,还是运行时有效等等)
@Documented是一个标记注解,里面没有任何属性,用 @Documented 注解修饰的注解类会被 JavaDoc 工具提取成文档。(不常用,可选项)
@Inherited也是一个标记注解,,没有定义属性,作用是为了表示该注解可以被继承(比如说:你自定义了一个A注解,并且使用了@Inherited修饰,然后在paren类使用了A注解,那么paren的所有子类都默认继承了注解A)。【不常用】



4)带大家看一下源码,看一下这几个元注解分别定义了哪些属性,并且有什么值:

 ①Target注解

可以看到,Target注解只是定义了一个Value属性,属性类型为 ElementType,来看一下ElementType有哪些值

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,  //把该注解当做一个类型来使用

    /**
     * Module declaration.
     *
     * @since 9
     */
    MODULE
}

 @Retention

 Retention也是只定义了一个value属性,该属性类型为: RetentionPolicy,我们再一起看看Retention有哪些值可以选择:

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,  //表示该注解的生命周期只在编译阶段

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS, //该注解被保留在class文件上
 
    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME //该注解生命周期在运行时
}

@Documented

可以看到,Documented注解只是一个标记注解,里面什么属性都没有声明,作用是:使用了该注解的类,会被 doc工具提取成参考文档

@Inherited

 这个注解也是一个标记注解,表示该注解是可以被继承的

总结

以上就是Java注解自定义的全部过程了,注解出现为开发人员提供了很大的便利,从以前spring工程需要繁琐复杂的xml各种配置,到现在只需要在类上添加注解,其中的对比一用可知,这里的注解也可以充当理解为就是一个标识符,比如说在类上使用 @Component,那么springBoot容器启动的时候就可以知道该类需要加载到容器中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/930211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS App的设计规范

iOS App 的设计规范是苹果公司为开发人员和设计师提供的一系列准则和建议,旨在确保应用在 iOS 设备上的外观、交互和用户体验保持一致。以下是一些常见的 iOS App 设计规范要点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包…

LEADTOOLS V22 for Python -Crack

LEAD Technologies Inc 是面向所有主要平台和编程语言的应用程序开发的人工智能 SDK 的领先提供商,很高兴地宣布在其最新的 LEADTOOLS 版本 22 更新中添加了完整的 Python 支持。 Python是一种动态的高级编程语言,广泛应用于科学计算、数据分析、人工智…

似懂非懂的 AspectJ

今天想和小伙伴们聊一下我们在使用 Spring AOP 时,一个非常常见的概念 AspectJ。 1. 关于代理 小伙伴们知道,Java 23 种设计模式中有一种模式叫做代理模式,这种代理我们可以将之称为静态代理,Spring AOP 我们常说是一种动态代理…

R语言常用基本函数,含实例:万字总结

目录 vector:创建向量(默认填充0,空字符,FALSE) data.frame :可以看作由多个向量组成的表格,每个向量代表表格的一列数据 sequence:创建序列(可以简写为seq) dim:获取矩阵或数组的维度信息 length subset&#x…

优思学院|传统流水线生产与单元式生产的差异与优势对比

在制造业领域,生产方式的选择对于生产效率和产品质量至关重要。传统流水线生产和精益生产中的单元式生产是两种常见的生产模式,它们在工作方式、优势以及适用情境上存在着显著的差异。本文将对传统流水线生产和单元式生产进行比较,并探讨它们…

“探索Spring与MyBatis集成的最佳实践与技巧“

目录 引言:1.Spring与MyBatis集成的基本配置2.Spring aop集成pagehelper插件总结附带内容: 引言: 在现代的软件开发中,Spring和MyBatis是两个非常流行的框架。Spring提供了强大的依赖注入和面向切面编程的功能,而MyBa…

炫酷前端页面,鼠标点击特效

最近发现了两个好看的鼠标点击特效&#xff0c;收藏起来用作学习使用&#xff0c;以及更方便的利用 一、鼠标点击弹出爱心 效果图 html源码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…

应知道的python基础知识

1、运算符 2、特殊情况下的逻辑运算 3、循环中的else 3.1 while else 3.2 for else 4、列表相关操作 列表的相关操作 4.1增(append, extend, insert) 通过append可以向列表添加元素:列表.append(新元素数据)通过extend可以将另一个列表中的元素逐一添加到列表中:列表.exte…

【推荐】Spring与Mybatis集成

目录 1.概述 2.集成 2.1代码演示&#xff1a; 3.整合 3.1概述 3.2 进行整合分页 接着上两篇&#xff0c;我已经写了Mybatis动态之灵活使用&#xff0c;mybatis的分页和特殊字符的使用方式接下来把它们集成起来&#xff0c;是如何的呢&#x1f447;&#x1f447;&#x1…

深入理解linux内核--系统启动

史前时代&#xff1a;BIOS 计算机在加电的那一刻几乎是毫无用处的&#xff0c;因为RAM芯片中包含的是随机数据&#xff0c;此时还没有操作系统在运行。 在开始启动时&#xff0c;有一个特殊的硬件电路在CPU的一个引脚上产生一个RESET逻辑值。 在RESET产生以后&#xff0c;就把…

pytorch学习(7)——神经网络优化器torch.optim

1 optim 优化器 PyTorch神经网络优化器&#xff08;optimizer&#xff09;通过调整神经网络的参数&#xff08;weight和bias&#xff09;来最小化损失函数&#xff08;Loss&#xff09;。 学习链接&#xff1a; https://pytorch.org/docs/stable/optim.html 1.1 优化器基类 使…

Wlan——无线桥接的基本概念及配置

目录 WDS无线分布式系统 WDS组网拓扑 中继桥接 一对一桥接 一对多桥接 多跳桥接 锐捷无线桥接的配置 根桥的配置(瘦AP是在AC上配置) 非根桥的配置&#xff08;直接在AP上配置&#xff09; WDS无线分布式系统 WDS指AP之间通过无线链路连接两个或多个独立的局域网&…

picGo+gitee+typora设置图床

picGogiteetypora设置图床 picGogitee设置图床下载picGo软件安装picGo软件gitee操作在gitee中创建仓库在gitee中配置私人令牌 配置picGo在插件设置中搜索gitee插件并进行下载 TyporapicGo设置Typora 下载Typora进行图像设置 picGogitee设置图床 当我了解picGogitee可以设置图床…

每日两题 129求根节点到叶节点数字之和 257二叉树的所有路径

129 题目 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有…

pytestx容器化执行引擎

系统架构 前端、后端、pytest均以Docker容器运行服务&#xff0c;单独的容器化执行引擎&#xff0c;项目环境隔离&#xff0c;即用即取&#xff0c;用完即齐&#xff0c;简单&#xff0c;高效。 前端容器&#xff1a;页面交互&#xff0c;请求后端&#xff0c;展示HTML报告 后…

2023-8-25食物链

题目链接&#xff1a;食物链 #include <iostream>using namespace std;const int N 50010;int n, m; int p[N], d[N];int find(int x) {if(p[x] ! x){int t find(p[x]);d[x] d[p[x]];p[x] t;}return p[x]; }int main() {cin >> n >> m;for(int i 1; i…

Could not initialize class net.sf.cglib.beans.BeanMap$Generator异常解决

目录 前言 解决方法 复盘分析 前言 使用easyexcel时&#xff0c;研发环境正常, 服务器编译正常, EasyExcel调用方法的时候, 服务器出现Could not initialize class net.sf.cglib.beans.BeanMap$Generator问题。 报错信息 com.alibaba.excel.exception.ExcelAnalysisExc…

​LeetCode解法汇总2236. 判断根结点是否等于子结点之和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个 …

帆软报表系统查看数据库密码

有子曰&#xff1a;“礼之用&#xff0c;和为贵。先王之道&#xff0c;斯为美。小大由之。有所不行&#xff0c;知和而和&#xff0c;不以礼节之&#xff0c;亦不可行也。” 查看数据库密码 构造payload&#xff0c;访问漏洞url&#xff1a; /ReportServer?opfr_server&…

商品搜索网:连接您与各类商品的桥梁

导语&#xff1a;在如今信息爆炸的时代&#xff0c;购物已经不再是传统的实体店购买&#xff0c;而是通过互联网实现的线上购物方式。而要实现高效的线上购物&#xff0c;商品搜索引擎则成为我们的得力助手。作为国内垂直的商品搜索之一&#xff0c;为中国用户提供全面的数码电…