扫描指定package包下的类的工具类

3 篇文章 0 订阅
1 篇文章 0 订阅

    最近在做自己的springMVC的轮子,涉及指定包下类的加载,所以写了一下此工具类。

package com.jsalpha.utils.load;

import com.jsalpha.utils.common.DirectoryFileFilter;
import com.jsalpha.utils.common.SuffixFilenameFilter;

import java.io.File;
import java.util.LinkedList;
import java.util.List;

/**
 * @author dengjingsi
 * 加载指定包下的类的工具类
 */
public class ClassOfPackageLoader {

    /**
     * 加载path目录下的packageName中所有类
     * @param path package所在的地址
     * @param packageName package的名字
     * @throws ClassNotFoundException
     */
    public void loadInnerClassOfpackage(String path,String packageName) throws ClassNotFoundException {
        //存储扫描到的类名变量
        LinkedList<String> classNames = new LinkedList<>();
        //获取包下的所有的类名
        collectClassOfPackageInner(path,packageName,classNames);
        //加载所有扫描到的类
        loadClass(classNames);
    }

    /**
     * 根据提供的包名,以及包所在的地址,扫描并存储package下的所有类的类名
     * @param path package的地址
     * @param packageName 包名
     * @param classes 供存储类名的变量
     * @throws ClassNotFoundException
     */
    public void collectClassOfPackageInner(String path,String packageName,LinkedList<String> classes){
        String packagePath = packageName.replace(".",File.separator);
        File f = new File(path+File.separator+packagePath);
        String[] fileNames = null;
        if(f.exists()){
            //获取该路径下所有的.class类文件
            fileNames = f.list(new SuffixFilenameFilter());
            for(String classFileName : fileNames){
                classFileName = classFileName.substring(0,classFileName.length()-6);
                classes.add(packageName+"."+classFileName);
            }
            //获取该路径下的所有目录
            File[] files = f.listFiles(new DirectoryFileFilter());
            for(File file : files){
                collectClassOfPackageInner(path,packageName+"."+file.getName(),classes);
            }
        }
    }

    /**
     * 根据classNames中类名,加载所有类
     * @param classNames 需要加载的类名集合
     * @throws ClassNotFoundException
     */
    public void loadClass(List<String> classNames) throws ClassNotFoundException {
        for(String className : classNames){
            loadClass(className);
        }
    }

    /**
     * 加载类名为className的类
     * @param className 需要加载的类名
     * @return
     * @throws ClassNotFoundException
     */
    public Class<?> loadClass(String className) throws ClassNotFoundException {
        return this.getClass().getClassLoader().loadClass(className);
    }


    public static void main(String[] args) throws ClassNotFoundException{
        /**
         * 测试
         * 注意:如果你的测试结果报ClassNotFoundException异常,请检查你的classPath参数对应的路径下有没有指定的包
         */
        ClassOfPackageLoader myClassLoader = new ClassOfPackageLoader();
        //下边是我测试的包所在绝对地址和包名
        myClassLoader.loadInnerClassOfpackage("/Users/iyunxiao/IdeaProjects/utils/target/classes","com.jsalpha.utils");
    }
}
package com.jsalpha.utils.common;

import java.io.File;
import java.io.FileFilter;

/**
 * @author dengjingsi
 * 目录文件过滤器,过滤指定路径下的目录
 */
public class DirectoryFileFilter implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory()){
            return true;
        }
        return false;
    }
}
package com.jsalpha.utils.common;

import java.io.File;
import java.io.FilenameFilter;

/**
 * @author dengjingsi
 * 实现过滤以某字符串结尾的过滤器,空构造器,默认实现过滤以.class结尾的文件
 */
public class SuffixFilenameFilter implements FilenameFilter {
    private String endWith = ".class";

    /**
     * 构建默认扫描.class后缀的文件过滤器
     */
    public SuffixFilenameFilter() {
    }

    /**
     * 构建扫描endWith后缀的文件过滤器
     * @param endWith
     */
    public SuffixFilenameFilter(String endWith) {
        this.endWith = endWith;
    }

    @Override
    public boolean accept(File dir, String name) {
        if(name.endsWith(endWith)){
            return true;
        }
        return false;
    }
}

项目结构

提醒大家注意:类加载,只是把类的二级制文件加载到JVM而已,并没有初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值