征服SpringSpringBoot极简教程 · Spring Boot Spring-Boot

扫描包下所有的Controller(一)

2018-06-12  本文已影响26人  z七夜

写在前面

准备手写一个简易版的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

上一篇下一篇

猜你喜欢

热点阅读