我是靠谱客的博主 英俊手套,最近开发中收集的这篇文章主要介绍JAVA使用反射动态的获取接口的所有实现类(通过接口类路径),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        List<接口名> list = new ArrayList<>();
        List<Class> clazzs = getAllInterfaceAchieveClass(接口名.class);
        for(Class clazz : clazzs){
            list.add((接口名)clazz.newInstance());
        }
        //打印Class对象
        for(接口名 cla : list){
            System.out.println("实现类:"+cla.getClass());
        }
    }

/**
     * 获取所有接口的实现类
     * 
     * @return
     * @throws Throwable
     */
    @SuppressWarnings("unchecked")
    public List<Class> getAllInterfaceAchieveClass(Class clazz) throws Throwable {
        ArrayList<Class> list = new ArrayList<>();
        // 判断是否是接口
        if (clazz.isInterface()) {
            ArrayList<Class> allClass = getAllClassByPath(clazz.getPackage().getName());
            /**
             * 循环判断路径下的所有类是否实现了指定的接口 并且排除接口类自己
             */
            for (int i = 0; i < allClass.size(); i++) {
                // 排除抽象类
                if (Modifier.isAbstract(allClass.get(i).getModifiers())) {
                    continue;
                }
                // 判断是不是同一个接口
                if (clazz.isAssignableFrom(allClass.get(i))) {
                    if (!clazz.equals(allClass.get(i))) {
                        list.add(allClass.get(i));
                    }
                }
            }
        }
        return list;
    }

    /**
     * 从指定路径下获取所有类
     * 
     * @return
     * @throws Throwable
     */
    public ArrayList<Class> getAllClassByPath(String packagename) throws Throwable {
        ArrayList<Class> list = new ArrayList<>();
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        String path = packagename.replace('.', '/');
        ArrayList<File> fileList = new ArrayList<>();
        Enumeration<URL> enumeration = classLoader.getResources(path);
        while (enumeration.hasMoreElements()) {
            URL url = enumeration.nextElement();
            fileList.add(new File(url.getFile()));
        }
        for (int i = 0; i < fileList.size(); i++) {
            list.addAll(findClass(fileList.get(i), packagename));
        }
        return list;
    }

    /**
     * 如果file是文件夹,则递归调用findClass方法,或者文件夹下的类 如果file本身是类文件,则加入list中进行保存,并返回
     * 
     * @param file
     * @param packagename
     * @return
     * @throws ClassNotFoundException
     */
    private ArrayList<Class> findClass(File file, String packagename) throws ClassNotFoundException {
        ArrayList<Class> list = new ArrayList<>();
        if (!file.exists()) {
            return list;
        }
        File[] files = file.listFiles();
        for (File file2 : files) {
            if (file2.isDirectory()) {
                assert !file2.getName().contains(".");// 添加断言用于判断
                ArrayList<Class> arrayList = findClass(file2, packagename + "." + file2.getName());
                list.addAll(arrayList);
            } else if (file2.getName().endsWith(".class")) {
                // 保存的类文件不需要后缀.class
                list.add(Class.forName(packagename + '.' + file2.getName().substring(0, file2.getName().length() - 6)));
            }
        }
        return list;
    }

最后

以上就是英俊手套为你收集整理的JAVA使用反射动态的获取接口的所有实现类(通过接口类路径)的全部内容,希望文章能够帮你解决JAVA使用反射动态的获取接口的所有实现类(通过接口类路径)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部