通过项目下的包名获取包下的全部类

Posted bihanghang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过项目下的包名获取包下的全部类相关的知识,希望对你有一定的参考价值。

通过项目下的包名获取包下的全部类

public class GetClasses {

    public static Set<Class<?>> classes = new HashSet<>();

    public static void main(String[] args) {
        GetAllClass("com.bihang.seayatest.nio");
        System.out.println(classes.size());
    }

    public static void GetAllClass(String packageName){
        Enumeration<URL> dirs = null;
        try {
            dirs = Thread.currentThread().getContextClassLoader().getResources(packageName.replace(".","/"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (dirs.hasMoreElements()){
            //获取物理路径
            String filePath = dirs.nextElement().getFile();
            addPathToClasses(filePath,packageName,classes);
        }
    }

    public static void addPathToClasses(String classPath, String rootPackageName, Set<Class<?>> classes) {
        File file = new File(classPath);
        if (!file.exists() && !file.isDirectory())
            return;

        if (file.isDirectory()) {
            File[] list = file.listFiles();
            //如果是文件夹就需要在包名后面添加文件名
            for (File path :
                    list) {
                if (path.isDirectory())
                    addPathToClasses(path.getAbsolutePath(), rootPackageName+"."+path.getName(), classes);
                else
                    addPathToClasses(path.getAbsolutePath(), rootPackageName, classes);
            }
        } else {
            if (file.getName().endsWith(".class")){
                String className = file.getName().substring(0,
                        file.getName().length() - 6);
                try {
                    classes.add(Thread.currentThread().getContextClassLoader().loadClass(rootPackageName + ‘.‘+ className));
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

getName()方法

返回文件名称,包括后缀.

list()方法

返回文件名的数组,是String的数组。

listFiles()方法

返回文件的数组,也就是绝对路径的数组。

accept()方法

listFiles()方法会为此目录对象下的每一个文件名调用accpet()方法,来判断该文件是否包含在内,判断结果由accept()方法返回的布尔值表示。

exists()

创建之前,要通过file.exists()判断该文件或者文件夹是否已经存在,如果返回true,是不能创建的。

以上是关于通过项目下的包名获取包下的全部类的主要内容,如果未能解决你的问题,请参考以下文章

java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名

包和权限修饰符

java 获取包下的所有类,附完整源码和测试代码

Android怎么获取一个包下的全部类名

Android项目,在manifest中修改包名之后,如何批量更改导入R文件

Spring根据包名获取包路径下的所有类