JavaWeb开发中,Class.getResource()和ClassLoader.getResource()区别
问题
手写一个简易的springMVC,其中一个功能是扫描指定包路径下的所有类,并将其加入到集合中去,被折磨了好久
正确写法1
public void doScanner(String scanPackage) {
// 将.的形式改为/ 比如com.fanyinhang ->> com/fanyinhang
URL url=this.getClass().getClassLoader().getResource(scanPackage.replaceAll("\\.", "/"));
File classDir=new File(url.getFile());
for(File file:classDir.listFiles()){
if(file.isDirectory()){
doScanner(scanPackage+"."+file.getName());
}else{
String className=scanPackage+"."+file.getName().replace(".class","");
classNames.add(className);
}
}
}
正确写法2
public void doScanner(String scanPackage) {
// 将.的形式改为/ 比如com.fanyinhang ->> com/fanyinhang
URL url=this.getClass().getResource("/"+scanPackage.replaceAll("\\.", "/"));
File classDir=new File(url.getFile());
for(File file:classDir.listFiles()){
if(file.isDirectory()){
doScanner(scanPackage+"."+file.getName());
}else{
String className=scanPackage+"."+file.getName().replace(".class","");
classNames.add(className);
}
}
}
这两种写法的区别仅仅在于Class.getResource()和ClassLoader.getResource()
总结
Class.Resource(String name) 可以是相对本文件的路径;也可以是绝对路径,也就是项目的根路径(如 /com/fanyinhang)
ClassLoader.getResource(String name)可以是相对于项目根路径(如 com/fanyinhang),但是无法接收绝对路径
希望能够帮助各位小伙伴们!