前言:一步一步來實現迷你ioc框架,前面的容器工廠也是一個鋪墊,這次的掃描文件也是一個鋪墊……
需求:掃描當前項目下所有文件。包括文件夾下文件夾里面的文件。利用遞歸進行掃描
ScanFileUtil類
package edu.nf.beans.util; import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; /** * Created by Administrator on 2017/12/12. */ public class ScanUtil { //定義一個set來保存完整類名 private static Set<String> classNames = new HashSet<String>(); public static Set<String> scan(String packageName) { if(packageName==null){//拋異常 throw new RuntimeException("The path can not be null."); } //傳入的包名格式為 edu.nf 進行轉換 String packagePath = packageName.replace(".","\\"); //根據當前線程當前執行類獲取url ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { //枚舉獲得一個路徑 Enumeration<URL> urls = loader.getResources(packagePath); while (urls.hasMoreElements()){//如果不為空 URL url = urls.nextElement();//獲取路徑 System.out.println(url+"111"); if("file".equals(url.getProtocol())){//如果是文件 String path = URLDecoder.decode(url.getPath(),"utf-8");//處理中文亂碼 scanFromDir(path,packageName);//進行類掃描,保存Set集合 } if("jar".equals(url.getProtocol())){//如果是jar JarURLConnection connection = (JarURLConnection)url.openConnection(); String pathjar = URLDecoder.decode(String.valueOf(connection),"utf-8"); scanFromDir(pathjar,packageName); } } } catch (IOException e) { throw new RuntimeException("Resolve path error.", e); } return classNames; } /** * 從項目文件獲取某包下所有類 * @param filePath 文件目錄 * @param packageName 包名 */ private static void scanFromDir(String filePath,String packageName){ File[] files = new File(filePath).listFiles(); packageName = packageName + "."; for (File childFile:files){ //遍歷文件 if(childFile.isDirectory()){//還是文件夾就繼續遞歸 scanFromDir(childFile.getPath(),packageName+childFile.getName()); }else{ String fileName = childFile.getName();//文件名 if(fileName.endsWith(".class")){//判斷文件名是否是.class結尾 if(packageName.charAt(0)=='.'){//判斷開頭是否有'.',有的話截取 packageName = packageName.substring(1,packageName.length()); } //拼接字符串,得到完整類名 如:edu.nf.beans.util.ScanUtil String className = packageName+fileName.replace(".class",""); classNames.add(className); } } } } public static void main(String[] args) { Set<String> classNames=scan("edu.nf"); for(String path:classNames){ System.out.println(path); } } }
掃描文件,有許多種方式,但是都離不開遞歸