【小工具】—— 包扫描

在本篇博文中,本人要讲解一个用起来很容易的小工具 —— 包扫描

包扫描

定义

通过所给的包名称,扫描这个包中的所有文件,并提供抽象类以供我们对这些文件进行处理

那么,本人来展示下代码:

package edu.youzg.util;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public abstract class PackageScanner {
	
	public PackageScanner() {
	}
	
	/* 处理类 */
	public abstract void dealClass(Class<?> klass);
	
	/* 通过所传File类参数以及相应的包名称来处理包 */
	private void dealPackage(File cur, String packageName) {
		File[] files = cur.listFiles();
		for (File file : files) {	//遍历这个问渐渐中的所有包含的子文件/子文件夹
			if (file.isFile()) {	//如果是文件
				String fileName = file.getName();
				if (!fileName.endsWith(".class")) {	//如果是.class文件
					continue;
				}
				fileName = fileName.replace(".class", "");
				String className = packageName + "." + fileName;
				try {
					Class<?> klass = Class.forName(className);
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			} else {	//如果是文件夹
				dealPackage(file, packageName + "." + file.getName());
			}
		}
	}
	
	/* 通过URL来处理相应的Jar包 */
	private void dealJar(URL url) {
		try {
			JarURLConnection connection = (JarURLConnection) url.openConnection();
			JarFile jarFile = connection.getJarFile();
			Enumeration<JarEntry> entryList = jarFile.entries();
			while (entryList.hasMoreElements()) {
				JarEntry jarEntry = entryList.nextElement();
				if (jarEntry.isDirectory() || !jarEntry.getName().endsWith(".class")) {	//如果是文件夹,或者不是.class文件,运行下一轮循环
					continue;
				}
				String className = jarEntry.getName();	//组装我们执行反射机制所需的类名
				className = className.replace(".class", "");
				className = className.replace('/', '.');
				try {
					Class<?> klass = Class.forName(className);
					dealClass(klass);	//处理通过反射机制所获得的类
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/* 通过所给的包名称,去扫描这个包中的所有信息 */
	public void scanPackage(String packageName) {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		String pathName = packageName.replace('.', '/');
		try {
			Enumeration<URL> urls = classLoader.getResources(pathName);
			while (urls.hasMoreElements()) {	//如果包含很多文件(即:不是文件夹就是Jar包)
				URL url = urls.nextElement();
				if (url.getProtocol().equals("jar")) {	//如果是Jar包
					dealJar(url);
				} else {	//如果是文件夹
					try {
						File curFile = new File(url.toURI());
						dealPackage(curFile, packageName);
					} catch (URISyntaxException e) {
						e.printStackTrace();
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

可以看到,在上述代码中,对反射机制的运用十分巧妙,以及在我们运用这个小工具的时候,也要使用反射机制。

可能上述代码的逻辑看起来不是很复杂,但是在我们之后要对包中的类进行筛选操作的时候,确是能够方便好多!

那么,本篇博文的全部内容在这里就结束了。
喜欢的同学请留下免费👍和关注,谢谢!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值