MetadataReader、ClassMetadata、AnnotationMetadata的简单使用
在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的简单使用相关推荐
- 源码解读 Spring中Bean扫描的原理
前言. Spring和MyBatis整合的时候用到的Bean扫描是它Spring本身提供的.这一篇文章就写一下Spring是如何实现Bean扫描的. 不得不说Bean扫描是一个很重要的技术,在Spri ...
- Spring 注解编程之 AnnotationMetadata
在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解. 这篇文章我们主要深入 Annotat ...
- 应用集成——数据库集成与简单实现IoC容器
应用集成--数据库集成与简单实现IoC容器 项目地址:郝凯VioletEverGarden/ioc应用集成 问题描述: 设分别存在两个数据库,每个数据库都有一个学生表,表名与其中的属性名都不相同. ...
- Spring Boot自动装配过程解析及简单Demo演示
文章目录 1.约定大于配置 2.自动装配原理 2.1.`@SpringBootApplication` 2.2.`@EnableAutoConfiguration` 2.3.`@Import` 2.4 ...
- 刨析 SpringBoot 自动装配原理,其实很简单
J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...
- @Conditional的简单使用
先看下源码.首先继承了Condition接口. Condition接口源码 @FunctionalInterface public interface Condition {/*** Determin ...
- 在docker上安装部署tomcat项目 超简单,拿来主义
在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...
- Linux下tomcat的安装与卸载以及配置(超简单)
无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...
- Docker安装Apache与运行简单的web服务——httpd helloworld
Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...
- Docker的安装、镜像源更换与简单应用
Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...
最新文章
- smarty 模板引擎
- 今晚8点直播 | 美团是怎么玩儿AI的?大牛揭秘美团超大规模数据集——美团大脑
- 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
- spring三: 装配bean( 在xml中进行显式配置, 在java中进行显式配置)
- python os.system执行shell 命令
- HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
- 牛客网(剑指offer) 第二十五题 复杂链表的复制
- C/C++ 指针和数组
- DtCms.ActionLabel.Article.cs
- 数据概览_2015年概览:开源年鉴
- a6gpp php,内行人才知道的古董级玛莎拉蒂A6G 2000
- 三维重建笔记_重建方法简介与汇总
- 红帽linux7图形界面安装教程,RHEL7安装图形化
- argparse模块中的参数action、dest使用
- webgis、gis学习技巧总结
- eSIM卡崛起:传统运营商地位岌岌可危
- 反激式开关电源输出电压的PID控制之MATLAB仿真
- 编程语言与数据库的关系
- 常见的一些计算机安全类词汇
- LeetCode日拱一卒
热门文章
- android开发完全退出activity
- Luogu2680 [NOIP2015 提高组] 运输计划
- [网络流24题] 软件补丁问题
- jpa long oracle,springboot-data-jpa调用oracle存储过程
- 计算机应用与维修的视频,开关电源原理与维修视频全集(1-30集)
- 合肥青少年信息学计算机竞赛试题,合肥市第二十九届青少年信息学奥林匹克竞赛(小学组)试题及部分答案...
- qlineedit限制输入数字_请注意:输入设计需要这些交互反馈
- 计算机应用基础精品课程申报表,计算机应用基础精品课程申报表(15页)-原创力文档...
- java删除cookie_JAVAWEB使用保存cookie、删除cookie、获取cookie工具类
- CMU 15-213 Introduction to Computer Systems学习笔记(8) Machine-Level Programming-Advanced