1 packagejavax.servlet.util;2
3 importjava.io.File;4 importjava.io.FileFilter;5 importjava.io.FileNotFoundException;6 importjava.io.IOException;7 importjava.net.URL;8 importjava.net.URLDecoder;9 importjava.util.Enumeration;10 importjava.util.Iterator;11 importjava.util.LinkedHashSet;12 importjava.util.Set;13
14
15 public classPackageScanUtils16 {17
18
24 public static Set> getClasses(String packName,booleanscanSubdirectory)25 {26
27 Set> classes = new LinkedHashSet>(); //装载class集合
28 String packageName = packName; //获取包的名字 并进行替换
29 String packageUrlName = packageName.replace('.', '/');30 Enumeration urls; //定义一个枚举的集合 并进行循环来处理这个目录下的class
31 try
32 {33 urls =Thread.currentThread().getContextClassLoader().getResources(packageUrlName);34
35 //循环迭代下去
36 while(urls.hasMoreElements())37 {38
39 URL url = urls.nextElement(); //获取下一个元素
40
41 String protocol = url.getProtocol(); //得到协议的名称,比如http、file
42
43 if ("file".equals(protocol))44 { //如果是以文件的形式保存在服务器上
45
46 String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); //获取包的物理路径47 //以文件的方式扫描整个包下的文件 并添加到集合中
48 findClassesInPackageByFile(packageName, filePath, scanSubdirectory, classes);49 }50 }51 } catch(IOException e)52 {53 e.printStackTrace();54 }55
56 returnclasses;57 }58
59
67 public static void findClassesInPackageByFile(String packageName, String packagePath, final boolean scanSubdirectory, Set> classes) throwsFileNotFoundException68 {69
70 File dir = new File(packagePath); //获取此包的目录 建立一个File
71 File[] dirfiles = dir.listFiles(newFileFilter()72 { //如果存在 就获取包下的所有文件 包括目录
73
74 public booleanaccept(File file)75 { //自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
76 return (scanSubdirectory && file.isDirectory()) || (file.getName().endsWith(".class"));77 }78 });79
80 for(File file : dirfiles)81 { //循环所有文件
82
83 if(file.isDirectory())84 { //如果是目录 则继续扫描
85 findClassesInPackageByFile(packageName==""? file.getName():packageName + "." +file.getName(), file.getAbsolutePath(), scanSubdirectory, classes);86 } else
87 { //如果是java类文件 去掉后面的.class 只留下类名
88
89 String className = file.getName().substring(0, file.getName().length() - 6);90 try
91 {92 if("".equals(packageName)){93 classes.add(Thread.currentThread().getContextClassLoader().loadClass(className));94 }else{95 classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' +className));96 }97 } catch(ClassNotFoundException e)98 {99 e.printStackTrace();100 }101 }102 }103 }104
105 public static voidmain(String[] args)106 {107 Set> clas=PackageScanUtils.getClasses("cn.javax",true);108 Iterator>cla=clas.iterator();109 while(cla.hasNext()){110
116 System.out.println(cla.next().getName());117 }118 }119 }