• java之扫描包里面的class文件


      一、class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法。但是扫描class就是一个很大的问题了。

      二、所以我这里写了一个简单的class文件扫描方式。

      三、主要是利用ClassLoader中能够通过包铭去需要目录的绝对路径特性,写的

      四、例子:

    /**
         * 提供直接调用的方法
         * @param packageName
         * @return
         * @throws IOException
         * @throws ClassNotFoundException
         */
        public static  List<Class> findClass(String packageName) throws IOException, ClassNotFoundException {
            return findClass(packageName, new ArrayList<>());
        }
    
        /**
         *
         * @param packageName
         * @param clazzs
         * @return
         * @throws ClassNotFoundException
         * @throws IOException
         */
        private static List<Class> findClass(String packageName, List<Class> clazzs) throws ClassNotFoundException, IOException {
            //将报名替换成目录
            String fileName = packageName.replaceAll("\.", "/");
            //通过classloader来获取文件列表
            File file = new File(Thread.currentThread().getContextClassLoader().getResource(fileName).getFile());
            File[] files = file.listFiles();
            for (File f:files) {
                //如果是目录,这进一个寻找
                if (f.isDirectory()) {
                    //截取路径最后的文件夹名
                    String currentPathName = f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf(File.separator)+1);
                    //进一步寻找
                    findClass(packageName+"."+currentPathName, clazzs);
                } else {
                    //如果是class文件
                    if (f.getName().endsWith(".class")) {
                        //反射出实例
                        Class clazz = Thread.currentThread().getContextClassLoader().loadClass(packageName+"."+f.getName().replace(".class",""));
                        clazzs.add(clazz);
                    }
                }
            }
            return clazzs;
    }

      五、测试:

    public static void main(String[] args) throws IOException, ClassNotFoundException {
            List<Class> clazzs = findClass("com.pinnet");
            System.out.println(clazzs);
    }

  • 相关阅读:
    异常
    动态链接库与静态链接库的区别
    OpenBLAS 安装与使用
    Eigen 优化技巧
    C++读取保存为二进制的 numpy 数组
    Sublime Text Windows版使用Conda环境
    Repeater 时间格式化
    C#与js的各种交互
    js 实现精确加减乘除
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/ll409546297/p/9341255.html
Copyright © 2020-2023  润新知