java 遍历包下所有类的方法

遍历当前项目下某个包下所有类

思路

1.遍历包下所有的类,实际就是先找到包对应的文件路径,然后根据文件路径找到对应文件夹,然后对文件夹进行遍历
2. 类都是以*.class* 结尾,故只要找到包文件夹下所有.class文件即可
3. 部分*$*.class为内部类或者匿名类,遍历的时候可进行过滤
4. 有时候以jar包形式部署,考虑文件类型为jar包,思路类似

代码实现

        // 包名
        String packageName = "com.el.canno.utils";
        // 包相对路径
        String packagePath = packageName.replace(".","/");
        // 资源URL
        URL url = ClassLoader.getSystemResource("");
        // 问价协议一般为 file or jar
        if("file".equals(url.getProtocol())) {
            File[] files = new File(url.getPath() + packagePath)
                    .listFiles(file -> file.getName().endsWith(".class") || file.isDirectory());
            for(File file : files){
                // 文件夹,可递归遍历,此处省略
                if(file.isDirectory()){
                    continue;
                }
                // 输出类名称
                System.out.println(file.getName().replace(".class",""));
            }
        }else if("jar".equals(url.getProtocol())){
            // 获取jar包
            JarFile jarFile =((JarURLConnection) url.openConnection()).getJarFile();
            // 拿到jar包下所有文件
            Enumeration entries = jarFile.entries();
            // 根据包名过滤文件
            while (entries.hasMoreElements()){
                JarEntry entry = entries.nextElement();
                if(entry.getName().startsWith(packagePath) || entry.getName().endsWith(".class")){
                    String name = entry.getName().replace(packagePath,"").replace(".class","");
                    // 包下文件夹,此处不遍历
                    if(name.contains("/")){
                        continue;
                    }
                    System.out.println(name);
                }
            }
        }

你可能感兴趣的:(Java)