通过一个接口查找实现该接口的所有的实现类【工具包ClassUtils】

本文介绍如何借助工具包ClassUtils,高效地查找给定接口的所有实现类,为Java开发者提供便利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过一个接口查找实现该接口的所有的实现类【工具包ClassUtils】


public class ClassUtils {
    // 给一个接口,返回所有接口的实现类
    public static List<Class> getAllClassByInterface(Class c) throws Exception {
        List<Class> resultClassList = new ArrayList<>();    // 返回结果
        if (c.isInterface()) {  // 判断是否为接口
            String name = c.getPackage().getName(); // 获取当前包名
                List<Class> allClass =getClass(name);
            for (int i = 0; i < allClass.size(); i++) {
                if (c.isAssignableFrom(allClass.get(i))) {
                    if (!c.equals(allClass.get(i))) {
                        resultClassList.add(allClass.get(i));
                    }
                }
            }
        } else {
            System.out.println("该Class不是一个接口");
        }
        return resultClassList;
    }

    private static List<Class> getClass(String name) throws Exception {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        String path = name.replace(".", "/");
        Enumeration<URL> resources = classLoader.getResources(path);
        List<File> fileList = new ArrayList<>();
        while (resources.hasMoreElements()) {
            URL url = resources.nextElement();
            fileList.add(new File(url.getFile()));
        }
        List<Class> classes = new ArrayList<>();
        for (File directory : fileList) {
            classes.addAll(findClasses(directory, name));
        }
        return classes;
    }

    private static List<Class> findClasses(File directory, String name) throws Exception {
        List<Class> classes = new ArrayList<>();
        if (!directory.exists()) {
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains(".");
                classes.addAll(findClasses(file, name + "." +
                        file.getName()));
            } else if (file.getName().endsWith(".class")) {
                classes.add(Class.forName(name + '.' +
                        file.getName().substring(0, file.getName().length() - 6)));
            }
        }

        return classes;
    }


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值