扫描包下所有的Controller(一)

作者: z七夜 | 来源:发表于2018-06-12 17:58 被阅读26次

    写在前面

    准备手写一个简易版的springmvc,大伙别笑,瞎弄,往下看看,指点一下
    1.扫描包
    2.得到包中所有的.class文件,使用map存储文件的全类名和Class实例

    3.判断类是否有Controller注解,和RequestMapping注解,
    4.如果有,用map存储,类的全类名和类对象,存储下映射路径
    5.判断是否有RequestMapping注解
    6.如果有,用map存储,映射路径和method实例
    https://www.jianshu.com/p/3b25b7f29bbd
    7.根据路径,反射调用类中的方法
    https://www.jianshu.com/p/0df260de4b13

    本文写的是如何扫描包,得到包中所有的类文件

    1.思路

    1.传入包名
    2.将包转换成文件夹(项目中的包,就是以文件夹的形式存在的)
    3.使用当前线程类加载器,获取资源,得到文件夹的物理路径,和项目路径
    4.递归查找文件夹中的文件

    2.实现

    1.将包名转换成文件夹

    packageName = packageName.replace(".","/");
    

    2.使用当前线程类加载器获取资源路径


    2.1 2.2

    3.递归查询文件夹中的文件

    2.3 2.4

    我们只想要红线右边的,项目的包名加类名


    image.png

    只需要在得到根目录的时候,截取一下


    image.png

    大工告成,得到包下所有的类文件

    封装成utils

     public static HashMap<String,Class<?>> scannerPackage(String packageName){
    
            packageName = packageName.replace(".","/");
            //得到包 文件夹
            try {
                Enumeration<URL> dirs = Thread.currentThread().getContextClassLoader().getResources(packageName);
                //得到包所在的根路径
                String rootPath = Thread.currentThread().getContextClassLoader().getResource(packageName).getPath();
                if (rootPath != null){
                    rootPath = rootPath.substring(rootPath.indexOf(packageName));
                }
                while (dirs.hasMoreElements()){
                    URL url = dirs.nextElement();
                    //判断是不是文件  url 有协议
                    if (url.getProtocol().equals("file")){
                        File file = new File(url.getPath());
                        //遍历文件夹下所有文件
                        scannerFolder(file,rootPath);
                    }
                }
                return classMap;
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("包不存在");
                return null;
            }
    
        }
    
        private static void scannerFolder(File folder, String rootPath) {
            //1.得到文件夹中所有文件
            File[] files = folder.listFiles();
            //2.遍历
            for (int i=0;i<files.length;i++){
                File file = files[i];
                if (file.isDirectory()){
                    //3.是文件夹,递归
                    scannerFolder(file,rootPath+"/"+file.getName());
                }else {
                    //是文件
                    String absolutePath = file.getAbsolutePath();
                    if (absolutePath.endsWith(".class")){
                        //System.out.println(rootPath+file.getName()+"被注册为控制器");
                        //4.是类文件
                        absolutePath = absolutePath.replace("\\","/");
                        String filePath = rootPath + absolutePath.substring(absolutePath.lastIndexOf("/"),absolutePath.indexOf(".class"));
                        filePath = filePath.replace("/",".");
                        //System.out.println("映射路径:"+filePath);
                        try {
                            classMap.put(filePath,Class.forName(filePath));
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    

    如有问题,请多多指教
    QQ群:552113611

    相关文章

      网友评论

        本文标题:扫描包下所有的Controller(一)

        本文链接:https://www.haomeiwen.com/subject/ftsreftx.html