实用小工具 包扫描Java字节码文件(类)

本文介绍了一个基于Spring框架的依赖注入小demo,通过无参构造和注解方式实现。文章详细展示了如何在Java环境下使用Spring框架,特别关注了从指定包中获取所有类的Class实例的方法。

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

这个是我在模拟实现Spring的依赖注入(无参构造和注解方式)的小demo时使用到的,因为是scala体系,所以想研究下Java的Spring框架,看有什么可以借鉴的地方。

获得对应包的所有文件:(需要配合后面的findAndAddClassesInPackageByFile方法)

//获得所有的类的Class
protected List<Class<?>> getClasses(String basePackage){
    List<Class<?>> classes = new ArrayList<Class<?>>();
    // 是否循环迭代
    boolean recursive = true;
    // 获取包的名字 并进行替换
    String packageDirName = basePackage.replace('.', '/');
    // 定义一个枚举的集合 并进行循环来处理这个目录下的things
    Enumeration<URL> dirs;
    try {
        dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
        // 循环迭代下去
        while (dirs.hasMoreElements()) {
            // 获取下一个元素
            URL url = dirs.nextElement();
            // 得到协议的名称
            String protocol = url.getProtocol();
            // 如果是以文件的形式保存在服务器上
            if ("file".equals(protocol)) {
                // 获取包的物理路径
                String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                // 以文件的方式扫描整个包下的文件 并添加到集合中
                findAndAddClassesInPackageByFile(basePackage, filePath, recursive, classes);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return classes;
}

查询包下所有的类,并且添加到集合中

protected void findAndAddClassesInPackageByFile(String basePackage, String filePath, boolean recursive, List<Class<?>> classes){
    // 获取此包的目录 建立一个File
    File dir = new File(filePath);
    // 如果不存在或者 也不是目录就直接返回
    if (!dir.exists() || !dir.isDirectory()) {
        return;
    }
    // 如果存在 就获取包下的所有文件 包括目录
    File[] dirfiles = dir.listFiles(new FileFilter() {
        // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
        public boolean accept(File file) {
            return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
        }
    });
    // 循环所有文件
    for (File file : dirfiles) {
        // 如果是目录 则继续扫描
        if (file.isDirectory()) {
            findAndAddClassesInPackageByFile(basePackage + "." + file.getName(), file.getAbsolutePath(), recursive, classes);
        } else {
            // 如果是java类文件 去掉后面的.class 只留下类名
            String className = file.getName().substring(0, file.getName().length() - 6);
            try {
                // 添加到集合中去
                classes.add(Class.forName(basePackage + '.' + className));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值