java扫_Java中的包扫描(工具)

1 packagecom.mec.packscanner.core;2

3 importjava.io.File;4 importjava.io.FileFilter;5 importjava.io.IOException;6 importjava.net.JarURLConnection;7 importjava.net.URISyntaxException;8 importjava.net.URL;9 importjava.util.Enumeration;10 importjava.util.jar.JarEntry;11 importjava.util.jar.JarFile;12

13 public abstract classPackageScanner {14 publicPackageScanner() {}15

16 public abstract void dealClass(Class>klass);17

18 //扫描一般的包。

19 private voidscanPackage(String packageName,File currentfile) {20 File[] filelist = currentfile.listFiles(newFileFilter() {21 //FileFilter是文件过滤器,源代码只写了一个accapt的抽象方法。

22 @Override23 public booleanaccept(File pathName) {24 if(pathName.isDirectory()) { //判断是否是目录

25 return true;26 }27 return pathName.getName().endsWith(".class");28 }29 });30

31 for(File file:filelist) {32 if(file.isDirectory()) {33 scanPackage(packageName + "." +file.getName(),file);34 }else{35 String fileName = file.getName().replace(".class", "");36 String className = packageName + "." +fileName;37 try{38 Class> klass = Class.forName(className);//取出所有的类

39 if(klass.isAnnotation() //不扫描注解类、枚举类、接口和八大基本类型。

40 ||klass.isEnum()41 ||klass.isInterface()42 ||klass.isPrimitive()) {43 continue;44 }45 dealClass(klass);46 } catch(ClassNotFoundException e) {47 e.printStackTrace();48 }49 }50 }51 }52

53 //扫描jar包方法。

54 private void scanPackage(URL url) throwsIOException {55 JarURLConnection urlConnection =(JarURLConnection) url.openConnection();56 JarFile jarfile =urlConnection.getJarFile();57 Enumeration jarEntries =jarfile.entries();58 while(jarEntries.hasMoreElements()) {59 JarEntry jarEntry =jarEntries.nextElement();60 String jarName =jarEntry.getName();61 if(!jarName.endsWith(".class")) {62 continue;63 }64 String className = jarName.replace(".class", "").replaceAll("/", ".");65

66 try{67 Class> klass =Class.forName(className);68 if(klass.isAnnotation()69 ||klass.isInterface()70 ||klass.isEnum()71 ||klass.isPrimitive()) {72 continue;73 }74 dealClass(klass);75 } catch(ClassNotFoundException e) {76 e.printStackTrace();77 }78 }79 }80

81 //用类名扫描

82 public void packageScan(Class>klass) {83 packageScan(klass.getPackage().getName());84 }85

86 //用包名进行扫描

87 public voidpackageScan(String packageName) {88 String packOpperPath = packageName.replace(".","/");89

90 //线程上下文类加载器得到当前的classpath的绝对路径.(动态加载资源)

91 ClassLoader classloader =Thread.currentThread().getContextClassLoader();92 try{93 //(Thread.currentThread().getContextClassLoader().getResource(""))94 //(来得到当前的classpath的绝对路径的URI表示法。)

95 Enumeration resources =classloader.getResources(packOpperPath);96 while(resources.hasMoreElements()) {97 //先获得本类的所在位置

98 URL url =resources.nextElement();99

100 //url.getProtocol()是获取URL的HTTP协议。

101 if(url.getProtocol().equals("jar")) {102 //判断是不是jar包

103 scanPackage(url);104 }else{105 //此方法不会自动将链接中的非法字符转义。106 //而在File转化成URI的时候,会将链接中的特殊字符如#或!等字符进行编码。

107 File file = newFile(url.toURI());108 if(!file.exists()) {109 continue;110 }111 scanPackage(packageName,file);112 }113 }114 } catch(IOException e) {115 e.printStackTrace();116 } catch(URISyntaxException e) {117 e.printStackTrace();118 }119 }120 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值