欢迎光临散文网 会员登陆 & 注册

关于获取路径下所有class文件

2023-03-10 18:45 作者:苏亚韓  | 我要投稿

关于获取路径下所有class文件

(最终目的:获取包下所有的类的全类名) 

分别有四种方法

1、遍历resources获取url

通过类加载器的getResource方法获取指定目录下的resource

        //pathName = "com/xxx/xxx" 

         Enumerationresources = classLoader.getResources(pathName); 

         while (resources.hasMoreElements())  {     

                URL url = resources.nextElement();

            }

2、如果是本地环境 也就是说 url.getProtocol() = File  

2.1 通过当前路径获取过滤出 class文件 和 目录

  

 /**

     * 获取路径下所有的 .class 文件 和  文件夹

     * @param filePath  文件目录

     * @param recursive 是否查询子文件夹

     * @return 文件

     */

    public static File[] findFiles(String filePath, boolean recursive) {

        //过滤出 class文件 和 目录

        return new File(filePath).listFiles(file ->

                (file.isFile() && file.getName().endsWith(POINT + CLASS)) ||

                        (file.isDirectory() && recursive));

    }

2.2 目录则进行递归 ,不是目录则为class文件直接保存全类名

public static void findFullClassName(String filePath,boolean recursive){

        //遍历过滤好的文件

        for (File file : findFiles(filePath,recursive)) {

            //如果文件是目录

            if (file.isDirectory()) {

                // ....

                //递归调用当前方法

                findFullClassName(file.getPath(),recursive);

            }else{

                //如果是class文件 则去除 后缀 .class

                String className = file.getName().substring(0, file.getName().lastIndexOf("."));

                //添加包名到list

            }

        }

    }

3、不是本地环境,也就是将项目打成jar包后(需要引起注意)

// url = 第二步的url

// 获取Jar资源

JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();

JarFile jarFile = jarURLConnection.getJarFile();

Enumeration entries = jarFile.entries();

while (entries.hasMoreElements()) {

    JarEntry jarEntry = entries.nextElement();

    String jarEntryName = jarEntry.getName();

    //包含.class 和 com/xxx/xxx 留下

    if (jarEntryName.contains(pathName) && jarEntryName.contains(POINT + CLASS)) {

        //如果是class文件 则去除 后缀 .class

        String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(POINT));

        //添加包名

        fullClassName.add(className.replaceAll(BACKSLASH,POINT));

    }

}

4、通过Spring工具获取Resource

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resolver.getResourceLoader());

String packagePath =

    ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + packageName.replace(".", "/") + "/**/*.class";

Resource[] resources = resolver.getResources(packagePath);

for (Resource r : resources) {

    MetadataReader reader = metaReader.getMetadataReader(r);

    fullClassName.add(reader.getClassMetadata().getClassName());

}

return fullClassName;

总结

1、Spring如果也是jar包运行环境的话,和步骤三是一致的。

2、Spring如果是本地运行环境的话,是通过找出每一个file文件listFiles方法找到目录及目录以下的文件。

3、作为学习,自己写一遍还是不错的。作为使用,推荐使用Spring封装好的获取指定路径资源方法。

关于获取路径下所有class文件的评论 (共 条)

分享到微博请遵守国家法律