在Spring源码中有很多场景会去解析类的信息,比如类名、类中的方法、类上的注解,这些都可以称之为类的元数据,在Spring中对类的元数据做了抽象,并提供了一些工具类。

MetadataReader表示类的元数据读取器,默认实现类为SimpleMetadataReader

测试代码如下:

// 自定义注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Pan
public @interface Qiu {}// 目标类
@JsonFormat
@Service
@Transactional(rollbackFor = Exception.class)
@Qiu
@Generated
public class MobianServiceImpl implements MobianService {....
}
public class Test {public static void main(String[] args) throws IOException, IOException {SimpleMetadataReaderFactory readerFactory = new SimpleMetadataReaderFactory();// 使用工厂构建一个metadataReader读取器MetadataReader metadataReader = readerFactory.getMetadataReader("pers.mobian.testtransactional.service.MobianServiceImpl");System.out.println("-----获取类的基本信息----");ClassMetadata classMetadata = metadataReader.getClassMetadata();// 判断是否是接口System.out.println(classMetadata.isInterface());// 判断是否是抽象类System.out.println(classMetadata.isAbstract());// 获取类的名字System.out.println(classMetadata.getClassName());System.out.println("-----获取类的注解信息----");AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();// 类上注解的元注解是否含有对应的注解(即针对注解的父注解)System.out.println(annotationMetadata.hasMetaAnnotation(Pan.class.getName()));// 类上是否有对应的注解System.out.println(annotationMetadata.hasAnnotation(Pan.class.getName()));for (String annotationType : annotationMetadata.getAnnotationTypes()) {// 打印类上的注解System.out.println(annotationType);}System.out.println("-----获取类的资源信息----");Resource resource = metadataReader.getResource();// 打印类的名字System.out.println(resource.getFilename());}
}

打印结果:

注意:

1、hasMetaAnnotation可以理解为是用来判断注解的父注解信息,hasAnnotation是用来判断当前类的注解信息。上面的测试案例中,目标类没有@Pan这个注解,但是修饰类的@Qiu的注解被@Pan注解修饰,所以前者打印true,后者打印false

 // 使用元方法读取器读取注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//
System.out.println(annotationMetadata.hasMetaAnnotation(Pan.class.getName()));
System.out.println(annotationMetadata.hasAnnotation(Pan.class.getName()));

2、在获取类上注解的时候,类上的注解需要被@Retention(RetentionPolicy.RUNTIME)注解修饰才能被扫描出来。我的理解是,由于该工具类的底层是使用ASM技术去获取类的class文件信息,继而完成信息的获取,如果我Retention设置为CLASS或者SOURCE,其底层在使用ASM技术去JVM中获取对应信息时,获取不到对应的class文件,以至于扫描不到对应的注解信息。

for (String annotationType : annotationMetadata.getAnnotationTypes()) {// 打印类上的注解System.out.println(annotationType);
}

MetadataReader、ClassMetadata、AnnotationMetadata的简单使用相关推荐

  1. 源码解读 Spring中Bean扫描的原理

    前言. Spring和MyBatis整合的时候用到的Bean扫描是它Spring本身提供的.这一篇文章就写一下Spring是如何实现Bean扫描的. 不得不说Bean扫描是一个很重要的技术,在Spri ...

  2. Spring 注解编程之 AnnotationMetadata

    在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解. 这篇文章我们主要深入 Annotat ...

  3. 应用集成——数据库集成与简单实现IoC容器

    应用集成--数据库集成与简单实现IoC容器 项目地址:郝凯VioletEverGarden/ioc应用集成 问题描述: ​ 设分别存在两个数据库,每个数据库都有一个学生表,表名与其中的属性名都不相同. ...

  4. Spring Boot自动装配过程解析及简单Demo演示

    文章目录 1.约定大于配置 2.自动装配原理 2.1.`@SpringBootApplication` 2.2.`@EnableAutoConfiguration` 2.3.`@Import` 2.4 ...

  5. 刨析 SpringBoot 自动装配原理,其实很简单

    J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...

  6. @Conditional的简单使用

    先看下源码.首先继承了Condition接口. Condition接口源码 @FunctionalInterface public interface Condition {/*** Determin ...

  7. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

  8. Linux下tomcat的安装与卸载以及配置(超简单)

    无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...

  9. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  10. Docker的安装、镜像源更换与简单应用

    Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...

最新文章

  1. smarty 模板引擎
  2. 今晚8点直播 | 美团是怎么玩儿AI的?大牛揭秘美团超大规模数据集——美团大脑
  3. 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
  4. spring三: 装配bean( 在xml中进行显式配置, 在java中进行显式配置)
  5. python os.system执行shell 命令
  6. HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
  7. 牛客网(剑指offer) 第二十五题 复杂链表的复制
  8. C/C++ 指针和数组
  9. DtCms.ActionLabel.Article.cs
  10. 数据概览_2015年概览:开源年鉴
  11. a6gpp php,内行人才知道的古董级玛莎拉蒂A6G 2000
  12. 三维重建笔记_重建方法简介与汇总
  13. 红帽linux7图形界面安装教程,RHEL7安装图形化
  14. argparse模块中的参数action、dest使用
  15. webgis、gis学习技巧总结
  16. eSIM卡崛起:传统运营商地位岌岌可危
  17. 反激式开关电源输出电压的PID控制之MATLAB仿真
  18. 编程语言与数据库的关系
  19. 常见的一些计算机安全类词汇
  20. LeetCode日拱一卒

热门文章

  1. android开发完全退出activity
  2. Luogu2680 [NOIP2015 提高组] 运输计划
  3. [网络流24题] 软件补丁问题
  4. jpa long oracle,springboot-data-jpa调用oracle存储过程
  5. 计算机应用与维修的视频,开关电源原理与维修视频全集(1-30集)
  6. 合肥青少年信息学计算机竞赛试题,合肥市第二十九届青少年信息学奥林匹克竞赛(小学组)试题及部分答案...
  7. qlineedit限制输入数字_请注意:输入设计需要这些交互反馈
  8. 计算机应用基础精品课程申报表,计算机应用基础精品课程申报表(15页)-原创力文档...
  9. java删除cookie_JAVAWEB使用保存cookie、删除cookie、获取cookie工具类
  10. CMU 15-213 Introduction to Computer Systems学习笔记(8) Machine-Level Programming-Advanced