zoukankan      html  css  js  c++  java
  • 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);
    }

  • 相关阅读:
    python使用消息队列RabbitMq(入门)
    python Condition类(锁)
    python锁
    python多线程的几种情形分析-三种情况
    git基本使用
    python学习笔记之数据类型、字符编码、文件处理
    NOIP2018提高组模拟题(五)
    10.28模拟赛
    差分+树状数组【p4868】Preprefix sum
    线段树【p2706】贪婪大陆
  • 原文地址:https://www.cnblogs.com/ll409546297/p/9341255.html
Copyright © 2011-2022 走看看