参考mybatis MapperScannerConfigurer.java

最终找到 Spring的一个类  ClassPathBeanDefinitionScanner.java

参考ClassPathBeanDefinitionScanner 和它的父类 ClassPathScanningCandidateComponentProvider,将一些代码进行抽取,得到如下工具类。

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.util.StringUtils;
import org.springframework.util.SystemPropertyUtils;import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;public class ClassScaner implements ResourceLoaderAware {//保存过滤规则要排除的注解private final List<TypeFilter> includeFilters = new LinkedList<TypeFilter>();private final List<TypeFilter> excludeFilters = new LinkedList<TypeFilter>();private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver);public static Set<Class> scan(String[] basePackages,Class<? extends Annotation>... annotations) {ClassScaner cs = new ClassScaner();if(ArrayUtils.isNotEmpty(annotations)) {for (Class anno : annotations) {cs.addIncludeFilter(new AnnotationTypeFilter(anno));}}Set<Class> classes = new HashSet<Class>();for (String s : basePackages)classes.addAll(cs.doScan(s));return classes;}public static Set<Class> scan(String basePackages, Class<? extends Annotation>... annotations) {return ClassScaner.scan(StringUtils.tokenizeToStringArray(basePackages, ",; \t\n"), annotations);}public final ResourceLoader getResourceLoader() {return this.resourcePatternResolver;}public void setResourceLoader(ResourceLoader resourceLoader) {this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);}public void addIncludeFilter(TypeFilter includeFilter) {this.includeFilters.add(includeFilter);}public void addExcludeFilter(TypeFilter excludeFilter) {this.excludeFilters.add(0, excludeFilter);}public void resetFilters(boolean useDefaultFilters) {this.includeFilters.clear();this.excludeFilters.clear();}public Set<Class> doScan(String basePackage) {Set<Class> classes = new HashSet<Class>();try {String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ org.springframework.util.ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage))+ "/**/*.class";Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);for (int i = 0; i < resources.length; i++) {Resource resource = resources[i];if (resource.isReadable()) {MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);if ((includeFilters.size() == 0 && excludeFilters.size() == 0)|| matches(metadataReader)) {try {classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));} catch (ClassNotFoundException e) {e.printStackTrace();}}}}} catch (IOException ex) {throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);}return classes;}protected boolean matches(MetadataReader metadataReader) throws IOException {for (TypeFilter tf : this.excludeFilters) {if (tf.match(metadataReader, this.metadataReaderFactory)) {return false;}}for (TypeFilter tf : this.includeFilters) {if (tf.match(metadataReader, this.metadataReaderFactory)) {return true;}}return false;}public static void main(String[] args) {ClassScaner.scan("com.hjzgg.test.thirdjar.config,com.hjzgg.test.thirdjar.web", null).forEach(clazz -> System.out.println(clazz));}
}

转载于:https://www.cnblogs.com/hujunzheng/p/7284280.html

Spring根据包名获取包路径下的所有类相关推荐

  1. Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题

    以下代码的 GOPATH 路径为 "/home/wohu/GoCode" 1. 同一个包内的函数可以相互调用 代码结构如下: wohu@wohu:~/GoCode/src$ tre ...

  2. C#中获取指定路径下特定开头和后缀的所有文件

    场景 指定一个文件路径,获取当前路径下所有文件,并筛选出以指定内容开头和结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 ...

  3. JAVA获取同一路径下所有子类或接口实现类

    2019独角兽企业重金招聘Python工程师标准>>> 整个测试代码如下: Java代码   package find; import java.io.File; import ja ...

  4. 通过输入ab包名和后缀名自动添加或修改ab包名(同一文件夹下的所有文夹都会被修改包括子文件夹)

    说明 temp = temp.Substring(temp.IndexOf("Assets")); 这段代码主要是获取的文件路径为完整路径,而AssetImporter.GetAt ...

  5. 【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 )

    文章目录 一.Android 应用的默认安装目录 二.查找 Android 应用的安装目录 1.查询当前正在运行的应用包名 2.根据包名查询应用安装路径 一.Android 应用的默认安装目录 应用安 ...

  6. java解析xml文件练习——通过应用包名获取应用图标即其他信息(基于魅族应用商店)...

    1.解析包名数据文件(txt文件),并生成包名数组: package jsouphtml;import java.io.BufferedReader; import java.io.File; imp ...

  7. Java包名与包路径

    很多初学者以为只要把生成的class文件放在某个目录下,这个目录名就成了这个类的包名.这是一个错误的看法,不是有了目录 结构,就等于有了包名.为Java类添加包必须在Java源文件中通过 packag ...

  8. C#中获取指定路径下指定后缀名的所有文件的路径的list

    场景 指定一个路径和后缀名,查找这个路径下所有以此后缀名结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ...

  9. 使用最新的python代码发送nbns协议包,获取同一局域网下其它电脑的名称

    可以使用python的socket库发送NBNS协议包来获取局域网内其他计算机的名称.下面是示例代码: importsocketdef get_host_by_name(name):addr = so ...

最新文章

  1. 关于Linux的一些个人研习感悟
  2. 【NLP】如何在文本分类任务中Fine-Tune BERT
  3. 《迷宫》之站立会议—5.15
  4. ospf 环回口的路由条目_路由策略之重分发示例分析
  5. MongoDB入门 - 安装教程
  6. 常用系统级加压工具简介
  7. Jquery根据JSON生成Table
  8. linux文件恢复dbf,linux平台下数据文件被误删后,如何及时得知并进行恢复-dbf文件怎么打开...
  9. poj2488-A Knight's Journey【DFS】
  10. JWT-JSON WEB TOKEN使用详解及注意事项
  11. 密码学系列之二:密码学基本概念
  12. 知识图谱关系抽取 python_知识图谱关系抽取
  13. 目前最好的DirectShow分离器和解码器: LAV Filter
  14. LaTeX算法流程中英文伪代码
  15. 【Windows】实现微信双开或多开
  16. 利用XML制作UGUI登陆界面
  17. 【每日早报】2019/08/08
  18. repr函数输出调试信息
  19. 杭州云栖·2050大会-团聚召集人手册
  20. 在线学生计算机,计算机学生顶岗实习计划(网络版)

热门文章

  1. linux死锁的例子,操作系统教程—Linux实例分析 孟庆昌 第8章 死锁new.ppt
  2. python期中考试知识点_大学期末考试,有哪些高效复习的技巧?
  3. rageframe2 数据库配置_RF 微商城 一款基于 RageFrame2 的免费开源的基础销售功能的微商城...
  4. 数学建模亚太赛优秀论文_2019亚太地区大学生数学建模竞赛志愿者等级评定结果公布!...
  5. Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...
  6. windows如何生成ssh密钥
  7. decimal转为string sql_PHP+Mysql防止SQL注入的方法
  8. java没有这样的元素异常_java – 没有这样的元素异常?
  9. BugkuCTF-Reverse题mobile1(gctf)
  10. 设置maven 参数调休_IDEA 使用 Maven构建Spark项目