写在前面
准备手写一个简易版的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
网友评论