当前位置: 首页 > ai >正文

纯原生Java实现:获取整个项目中指定接口所有的实现类

不使用第三方,不使用属性文件,不指定包名,获取整个系统中某一个接口所有的实现类,纯Java实现

/*** 类查找器,用于扫描类路径中的所有类,并找出指定类的实现类。* 该类通过递归扫描类路径下的所有 .class 文件,加载并判断是否为目标类的实现类。*/
public class ClassFinder {/*** 获取指定类的所有实现类(非接口本身)。* 从类路径根目录开始扫描,使用当前线程的类加载器获取资源路径。** @param clazz 要查找实现类的目标类(通常是抽象类或接口)* @return 返回目标类的所有实现类组成的列表*/public static List<Class<?>> getImplementationsOfMyService(Class<?> clazz) {List<Class<?>> implementations = new ArrayList<>();// 设置为空字符串表示从类路径根开始扫描String packageName = "";// 使用当前线程的类加载器加载类资源ClassLoader classLoader = Thread.currentThread().getContextClassLoader();Enumeration<URL> resources = null;try {// 获取类路径下对应包名的资源路径(转换为文件系统路径格式)resources = classLoader.getResources(packageName.replace('.', '/'));while (resources.hasMoreElements()) {URL resource = resources.nextElement();File file = new File(resource.getFile());// 开始递归扫描该目录下的类文件scanDirectory(clazz, file, "", implementations);}} catch (IOException e) {e.printStackTrace();}return implementations;}/*** 递归扫描目录及其子目录中的类文件。* 对每个类文件进行加载并判断是否是目标类的实现类。** @param clazz 目标类(要查找其实现类)* @param dir 当前扫描的目录* @param pkg 当前目录对应的包名前缀* @param list 存储符合条件的实现类*/private static void scanDirectory(Class<?> clazz, File dir, String pkg, List<Class<?>> list) {if (!dir.exists()) return;for (File file : Objects.requireNonNull(dir.listFiles())) {if (file.isDirectory()) {// 如果是目录,递归进入子目录继续扫描scanDirectory(clazz, file, pkg + file.getName() + ".", list);} else if (file.getName().endsWith(".class")) {// 构建完整的类名(包含包名)String className = pkg + file.getName().replace(".class", "");try {// 加载类Class<?> tmp = Class.forName(className);// 判断是否为目标类的实现类,并排除接口类型if (clazz.isAssignableFrom(tmp) && !tmp.isInterface()) {list.add(tmp);}} catch (Exception ignored) {// 忽略加载失败的类}}}}// 测试入口:演示如何使用ClassFinder查找AnnotationHandler接口的实现类public static void main(String[] args) throws Exception {// 查找AnnotationHandler接口的所有实现类List<Class<?>> classes = getImplementationsOfMyService(AnnotationHandler.class);System.out.println("找到以下实现类:");for (Class<?> c : classes) {System.out.println(c.getName());}}
}
http://www.xdnf.cn/news/3533.html

相关文章:

  • 每天一道算法题——推多米诺
  • 使用xlwings计算合并单元格的求和
  • Cesium 环境搭建
  • 组件通信-$attrs
  • 5个实用工具软件详细介绍
  • 多线程基础:线程创建、启动与生命周期管理
  • 【阿里云大模型高级工程师ACP学习笔记】2.9 大模型应用生产实践 (上篇)
  • ESP32 在Platform Arduino平台驱动外部PSAM,进行内存管理
  • 数字智慧方案5846丨智慧广场整体解决方案(91页PPT)(文末有下载方式)
  • mindyolo填坑
  • 应用接入Stripe支付实战【2025版+配置+服务端+客户端+生产级+架构图+代码】
  • 表管理(约束)实验
  • C语言与指针3——基本数据类型
  • Learning vtkjs之TubeFilter
  • TMI投稿指南(四):投稿相关网址
  • 【Linux】Linux基础命令
  • 27.电源和地的单点串并联接线隐患及对EMC的影响分析
  • 数字智慧方案6206丨智慧园区大数据整体解决方案(45页PPT)(文末有下载方式)
  • HDLBIT-程序(Procedures)
  • 【原创开发】无印去水印[特殊字符]短视频去水印工具[特殊字符]支持一键批量解析
  • CloudCompare 中的 KDTree详解
  • 设计模式简述(十六)门面模式
  • DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导
  • cPanel 的 Let’s Encrypt™ 插件
  • 平台介绍-开放API接口-鉴权
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变
  • MATLAB滤波工具箱演示——自定义维度、滤波方法的例程演示与绘图、数据输出
  • 详细说明StandardCopyOption.REPLACE_EXISTING参数的作用和使用方法
  • 虚幻引擎 IK Retargeter 编辑器界面解析
  • 上位机知识篇---PSRAM和RAM