@inherited 注解详解

2024-02-19 05:08
文章标签 详解 注解 inherited

本文主要是介绍@inherited 注解详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1【问题引出】

在 Springboot 项目中,通常会有一个启动类,而启动类中通常会有一个名为  @SpringBootApplication 的注解(如下图所示),而此注解就是 Springboot 项目启动类的核心注解。

我们打开 @SpringBootApplication 注解源码,可以看到,在源码中有一个 @Inherited 的注解,那么这个注解,它的作用是什么呢?

2【@inherited 源码】

在了解该注解作用之前,我们不妨看看该注解的英文解释和源码定义,这样会更加有利于我们对该注解的理解。

(2.1)inherited 翻译

 首先我们看翻译(来自百度翻译),可见 @inherited 有着 "继承","继任" 的意思。

(2.2)@inherite 源码

然后,我们打开 inherited 的源码,可以看到:

(1)该注解作用于整个程序运行中(@Retention(RetentionPolicy.RUNTIME);

(2)该注解只能修饰注解(@Target({ElementType.ANNOTATION_TYPE})),因此,它是一个元注解。

 再了解到上面的情况后,我们就可以对 @inherited 注解进一步探究了。

3【举例说明】

既然它是一个有着关于"继承"的注解,那么我们便可以联想到,Java类之间也有继承的关系,我们不妨创建两个类,让他们为父子关系,然后创建两个注解,作用于类上,两个注解之间唯一不同的区别就是有无 @Inherited修饰。

我们创建父类 Father 和 子类Child,作为实验类。

(3.1)Father 类

(3.2)Child 类(继承 Father  类)

 另外,我们再自定义两个注解,@HasInherited 和 @NoInherited,用于验证结果,前者注解包含@Inherited 注解,后者反之。

由于注解定义需要指明作用范围,以及作用的生命周期,那么我们不妨指定两个注解均作用于类上和整个代码运行生命周期中,让两者的唯一区别就是有无 @Inherited 注解。

(3.3)@HasInherited (有 @Inherited 注解)

(3.4)@NoInherited(无 @Inherited 注解)

 

 4【测试验证】

(4.1)创建 Test 测试类

我们再写一个测试类 Test,用于获取实验类(Father 和 Child)上所有的注解信息。

package com.test.inherited;import java.lang.annotation.Annotation;public class Test {public static void main(String[] args) {// 打印父类注解信息Annotation[] fatherAnnotations = Father.class.getAnnotations();System.out.println("------- 父类 Father 信息 --------");System.out.println("父类注解个数:" + fatherAnnotations.length);for (Annotation fa : fatherAnnotations) {System.out.println(fa.annotationType().getSimpleName());}// 打印子类注解信息Annotation[] childAnnotations = Child.class.getAnnotations();System.out.println("------- 子类 Child 信息 --------");System.out.println("子类注解个数:" + childAnnotations.length);for (Annotation ca: childAnnotations) {System.out.println(ca.annotationType().getSimpleName());}}}

 (4.2) 有 @Inherited 注解验证

首先,我们在父类只打上 @HasInherited 注解,子类不做处理,然后执行测试类 Test。

@HasInherited
public class Father {}

最终控制台打印所下:

------- 父类 Father 信息 --------
父类注解个数:1
HasInherited
------- 子类 Child 信息 --------
子类注解个数:1
HasInherited

 (4.3) 无 @Inherited 注解验证

我们在父类上只打上 @NoInherited 注解,子类不做处理,然后执行测试类Test。

@NoInherited
public class Father {}

最终控制台打印如下:

------- 父类 Father 信息 --------
父类注解个数:1
NoInherited
------- 子类 Child 信息 --------
子类注解个数:0

(4.4)结论

经过上面的演示,那么最终的结论,我们就不难得出来了。

结论:被 @Inherited 注解修饰的注解,如果作用于某个类上,其子类是可以继承的该注解的。反之,如果一个注解没有被 @Inherited注解所修饰,那么他的作用范围只能是当前类,其子类是不能被继承的。

5.【修改 Springboot 启动类】

既然 @SpringBootApplication 注解中也包含了 @Inherited 注解,那么针对上面的结论,我们不妨尝试下对 Springboot 启动类进行修改,我们可以写一个子类,去继承原启动类,同时把原启动的 mian 方法去掉,加在子类中,看是否能够启动成功?

(5.1)修改 Springboot 启动类前

启动类如图所示:

启动打印如下:

(5.2)修改 Springboot 启动类后

原启动类(只保留 @SpringBootApplication 注解)

子启动类(并未打任何注解)

 启动打印如下:

 可以看到,确实也是启动 OK 的,也验证了我们的推理。

6【总结】

当以后我们在定义一个作用于类的注解时候,如果希望该注解也作用于其子类,那么可以用@Inherited 来进行修饰。

 

这篇关于@inherited 注解详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723586

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos