天天看点

扫描java类文件_扫描Java包class文件

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 }