JAVA 中的注解可以继承吗?

news2024/11/28 12:32:57

前言

注解想必大家都用过,也叫元数据,是一种代码级别的注释,可以对类或者方法等元素做标记说明,比如 Spring 框架中的@Service@Component等。那么今天我想问大家的是类被继承了,注解能否继承呢?可能会和大家想的不一样,感兴趣的可以往下看。

简单注解继承演示

我们不妨来验证下注解的继承。

  1. 自定义一个注解

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface TestAnnotation {
    String value();}

复制代码

  • 注解可以被标记在类或者方法上

  1. 使用自定义注解

@TestAnnotation(value = "Class")static class Parent {
    @TestAnnotation(value = "Method")    public void method() {
    }}
static class Child extends Parent {        @Override    public void method() {            }
}

复制代码

  • Parent类和里面的方法使用了注解

  • Child类继承了 Parent 类, 重写了父类的方法

  1. 验证是否存在注解

public static void main(String[] args) throws NoSuchMethodException {
        Parent parent = new Parent();        log.info("ParentClass: {}", getAnnoValue(parent.getClass().getAnnotation(TestAnnotation.class)));        log.info("ParentMethod: {}", getAnnoValue(parent.getClass().getMethod("method").getAnnotation(TestAnnotation.class)));
        Child child = new Child();        log.info("ChildClass: {}", getAnnoValue(child.getClass().getAnnotation(TestAnnotation.class)));        log.info("ChildMethod: {}", getAnnoValue(child.getClass().getMethod("method").getAnnotation(TestAnnotation.class)));
    }
    private static String getAnnoValue(TestAnnotation annotation) {        if(annotation == null) {            return "未找到注解";        }
        return annotation.value();    }

复制代码

输出结果如下:

可以看到,父类的类和方法上的注解都可以正确获得,但是子类的类和方法却不能。这说明,默认情况下,子类以及子类的方法,无法自动继承父类和父类方法上的注解。

使用 @Inherited 演示

查了网上资料以后,在注解上标记@Inherited元注解可以实现注解的继承。那么,把@TestAnnotation注解标记了 @Inherited,就可以一键解决问题了吗?

重新运行,得到结果如下:

可以看到,子类可以获得父类类上的注解;子类方法虽然是重写父类方法,并且注解本身也支持继承,但还是无法获得方法上的注解。

如何重写方法继承注解?

实际上,@Inherited只能实现类上的注解继承。要想实现方法上注解的继承,你可以通过反射在继承链上找到方法上的注解。是不是听起来很麻烦,好在 Spring 框架中提供了AnnotatedElementUtils类,来方便我们处理注解的继承问题。

调用AnnotatedElementUtilsfindMergedAnnotation()方法,可以帮助我们找出父类和接口、父类方法和接口方法上的注解,实现一键找到继承链的注解:

输出结果如下图:

总结

自定义注解可以通过标记元注解@Inherited实现注解的继承,不过这只适用于类。如果要继承定义在接口或方法上的注解,可以使用 Spring 的工具类AnnotatedElementUtils

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

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

相关文章

基于springboot在线答疑系统

教师权限:首页、个人中心、疑难解答管理、试卷管理、试题管理、考试管理。 学生权限;首页、个人中心、问题发布管理、疑难解答管理、考试管理等功能模块的管理维护等操作,系统结构图如下图4-1所示。 图4-1 系统功能图 截图 目 录 摘 要 I …

[附源码]Node.js计算机毕业设计扶贫产品展销平台小程序Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

matlab 的help没了

前两天还正常用,今天输入help 关键字 回复是没有相关的内容。 解决办法: 按照如下选择就行了 然后输入 help help 就会有显示了 help - Help for functions in Command Window This MATLAB function displays the help text for the functionalit…

大数据MapReduce学习案例:倒排索引

文章目录一,案例分析(一)倒排索引介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)虚拟机上创建文本文件&#xff0…

数据结构双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 那…

WPF入门第三篇 ControlTemplate、Trigger与Storyboard

ControlTemplate、Trigger与Storyboard ControlTemplate通常用在Style中,Trigger通常作为ControlTemplate的一部分,StoryBoard表示动画效果,下面将通过对Button按钮设置这几项来简单说明这几项的用法。 在MainWindow中添加一个Button按钮&am…

Prometheus技术分享——如何监控宿主机和容器

这一期主要来跟大家聊一下,使用node_exporter工具来暴露主机和因公程序上的指标,利用prometheus来监控宿主机;以及通过通过Cadvisor监控docker容器。 一、部署node_exporter监控宿主机 1 下载软件包 wget https://github.com/prometheus/n…

分布式链路追踪SkyWalking

文章目录目录介绍服务端搭建注册中心启动注册中心修改持久化配置UI服务配置启动服务客户端搭建目录介绍 重要的目录结构分析如下: agent:客户端需要指定的目录,其中有一个jar,就是负责和客户端整合收集日志bin:服务端…

深入理解Linux网络技术内幕(十三)——协议处理函数

文章目录前言网络协议栈概论大蓝图Ethernet的链路层的选择(LLC和SNAP)网络协议栈的操作方式执行正确的协议处理函数特殊媒介封装协议处理函数的组织协议处理函数的注册Ethernet与IEEE 802.3帧设置封包类型设置Ethernet协议及长度逻辑链接控制&#xff08…

python+django球鞋商品竞拍卖网站vue

管理员功能模块 管理员登录,通过填写用户名、密码、角色等信息,输入完成后选择登录即可进入网上球鞋竞拍系统 管理员登录进入网上球鞋竞拍系统可以查看球鞋分类管理、热门竞拍管理、科比展区管理、用户管理、竞拍信息管理、消息通知管理、用户评价管理、…

单人脸的关键点检测

闲暇之余做了一个简单的单人的脸部关键点检测,使用的pytorch框架,别人训练好的现成模型。其中人脸检测模型是YOLOface5(onnx格式的权重),关键点检测模型是PFLD(能检测98个关键点),是…

计算机网络学习笔记(Ⅳ):网络层

目录 1 网络层内容 1.1 功能概述 1.任务 2.主要功能 1.2 数据交换方式 1.电路交换 2.报文交换 3.分组交换 4.方法对比 1.3 分组交换 1.数据报方式 2.虚电路方式 3.对比 2 路由算法与路由协议 2.1 路由算法 2.2 路由选择协议 3 IPv4 3.1 IP数据报格式 1.TCP/…

快2023年了,还不会性能调优?阿里技术官亲授“Java性能调优技术宝典”看完直接涨薪5K

一、前言 什么是性能调优? 性能调优其实很好理解,就是优化硬件、操作系统、应用之间的一个充分的协作,最大化的发挥出硬件的极致性能,来应对高负载的业务需求。 为什么需要性能优化? 其实说到底就是两个原因&#…

2023年湖北安全员ABC三类人员延期多久一次?甘建二

2023年湖北安全员ABC三类人员延期多久一次? 2023年湖北安全员ABC延期快来找甘建二报名,建设厅指定的 2023年湖北安全员ABC新办快来找甘建二报名,建设厅指定的 首先安全员分为三类:A证、B证、C证,每个证书都有相应的…

Spring源码解析-环境变量(下)

“不积跬步,无以至千里”。 接着聊上一篇文章中遗留的两个重要问题: 如何往Spring环境变量中添加自定义的环境变量?工作原理是什么?PropertyPlaceholderConfigurer这个类是怎么完成bean属性填充时“$”符号解析工作的&#xff1f…

数据库系统概论第2章 关系数据库

易错点1:实体完整性 实体完整性要求主属性不能取空值 而主属性不能取空值≠候选码不为空 因为候选码可以是两个属性的组合,而主属性是候选码的属性 举个例子: SC表中候选码为(学号,课程号) 主属性为学…

fetch向后端请求数据:get/post/put/patch/delete方式、解决catch不能主动捕获错误问题(超详细笔记)

1、什么是fetch: fetch是ES6出现的,它使用了 ES6 提出的 promise 对象,为了取代XMLHttpRequest而诞生的;提到XMLHttpRequest就不得不提ajax,ajax是一种实现前后端交互的技术,而ajax是基于XMLHttpRequest模块…

C++ Reference: Standard C++ Library reference: Containers: map: map: count

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/count/ 公有成员函数 <map> std::map::count size_type count (const key_type& k) const;计数具有特定键的元素 在容器中搜索键值等于k的元素&#xff0c;并返回匹配的数量。 因为map容器中的所…

搞懂商业智能 BI 、数据仓库、数据中台及其关系,此文足以

数字化如火如荼&#xff0c;企业的 IT 信息化也越演越烈&#xff0c;企业管理者对数据管理也是越来越重视&#xff0c;认识到数据资产带来的价值&#xff0c;本文对这些名词术语及内涵进行系统的解析&#xff0c;便于读者对数据平台相关的概念有全面的认识。 商业智能BI 商业…

本文分享Unity中的AI算法和实现3-有限状态机FSM(下)

本文分享Unity中的AI算法和实现3-有限状态机FSM(下) 回家生孩子, 暂停了一个多月的更新, 今天重新续上, ^_^. 在上一篇文章中, 我们分享了状态机的基本理论, 然后结合Unity的Animator来熟悉了这些理论, 最后设计了我们自己的状态机并实现了框架部分. 这一篇文章, 我们将继续…