扫描包并加载Class类

Java扫描包并加载Class类

  • 用途:
  1. 类似SpringBean的扫描某个包下的类并加载;
  2. 指定某个包下类的实例化并进行管理,用于快速main方法测试;
  • 代码(只描述原理根据情况自行修改):
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*;
import java.util.function.Predicate;

/**
 * 简易类扫描加载(只描述原理自行理解)
 * 注:这里只简单加载了一层文件的,有多需求可以改写文件处理
 *
 * @author caoch
 */
public class ClassScanLoad {

    /**
     * 扫描过滤后实例化类
     *
     * <pre>
     * 示例:
     * String scanPackage = "com.ttk.agg.cy.base.task.process";
     * instanceClassByScanFilter(scanPackage, StringTextEtlProcess.class, null);
     * </pre>
     *
     * @param scanPackage 扫描包
     * @param resultCls   结果类型,同时也是过滤类型,这些类型必须继承自某一接口或抽象类
     * @param filter      过滤器
     * @param <R>         实例化类型
     * @return 实例化类
     */
    public static <R> Set<R> instanceClassByScanFilter(String scanPackage, Class<R> resultCls, Predicate<Class<?>> filter) {
        return filterAndInstanceClass(resultCls, getUrlOfScanPackage(scanPackage), filter);
    }

    public static <R> Set<R> filterAndInstanceClass(
            Class<R> resultCls, Set<String> clsNameSet, Predicate<Class<?>> filter) {
        try {
            Set<R> rs = new HashSet<>();
            for (String clsName : clsNameSet) {
                Class<?> aClass = Class.forName(clsName);
                if (resultCls.isAssignableFrom(aClass)) {
                    if (filter == null || filter.test(aClass)) {
                        Object cast = aClass.cast(aClass.newInstance());
                        rs.add(resultCls.cast(cast));
                    }
                }
            }
            return rs;
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public static Set<String> getUrlOfScanPackage(String scanPackage) {
        String scanPackageUrl = scanPackage.replace(".", "/");
        Set<String> clsNameSet = new HashSet<>();
        try {
            Enumeration<URL> resources = ClassScanLoad.class
                    .getClassLoader().getResources(scanPackageUrl);
            while (resources.hasMoreElements()) {
                URL url = resources.nextElement();
                if ("file".equals(url.getProtocol())) {
                    File file = new File(url.toURI());
                    // System.out.println(file.getPath());
                    if (file.exists() && file.isDirectory()) {
                        File[] files = file.listFiles();
                        if (files != null) {
                            for (File clsFile : files) {
                                if (clsFile.exists() && !clsFile.isDirectory()) {
                                    // System.out.println(clsFile.getName());
                                    String clsFileName = clsFile.getName();
                                    if (clsFileName.endsWith(".class")) {
                                        String clsUrlName = scanPackage + "." + clsFileName.replace(".class", "");
                                        clsNameSet.add(clsUrlName);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return clsNameSet;
        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 递归文件夹
     */
    private static List<File> fileDepth(File file, Predicate<File> fileFilter) {
        List<File> list = null;
        if (file.exists()) {
            if (fileFilter == null || fileFilter.test(file)) {
                // 是否目录
                if (file.isDirectory()) {
                    File[] files = file.listFiles();
                    if (files != null) {
                        list = new ArrayList<>(files.length);
                        for (File clsFile : files) {
                            List<File> depthFiles = fileDepth(clsFile, fileFilter);
                            if (!depthFiles.isEmpty()) {
                                list.addAll(depthFiles);
                            }
                        }
                    }
                } else {
                    list = new ArrayList<>(1);
                    list.add(file);
                }
            }
        }
        if (list == null) {
            list = new ArrayList<>(0);
        }
        return list;
    }

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容