java中包的扫描

本文详细介绍了一种在Java中扫描包的技术,包括如何处理自己的包和jar包中的类。通过反射和文件系统操作,该技术能够遍历指定包下的所有类,并进行进一步的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中包的扫描

包括自己的包和jar中的包


   public abstract class PackageScanner {
	
	public abstract void dealClass(Class<?> klass);
	
	private boolean isClass(Class<?> klass) {
		if (klass.isAnnotation() 
				|| klass.isInterface()
				|| klass.isEnum()
				|| klass.isPrimitive()) {
			return false;
		}
		return true;
	}
	
	//自己编写的包的处理
	private void scanPackage(String packageName, File currentFile) {
		//过滤器
		File[] fileList = currentFile.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				if (pathname.isDirectory()) {
					return true;
				}
				return pathname.getName().endsWith(".class");
			}
		});
		for (File file : fileList) {
			if (file.isDirectory()) {
				scanPackage(packageName + "." + file.getName(), file);
			} else {
				String fileName = file.getName().replace(".class", "");
				String className = packageName + "." + fileName;
				try {
					//反射类
					Class<?> klass = Class.forName(className);
					//去掉是接口,注解等类
					if (!isClass(klass)) {
						continue;
					}
					//处理类
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//jar包中的包的处理方法
	private void scanPackage(URL url) throws IOException {
		JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
		JarFile jarFile = urlConnection.getJarFile();
		Enumeration<JarEntry> jarEntries = jarFile.entries();
		while (jarEntries.hasMoreElements()) {
			JarEntry jarEntry = jarEntries.nextElement();
			String jarEntryName = jarEntry.getName();
			//判断本文件是否依然为文件
			if (jarEntry.isDirectory() || !jarEntryName.endsWith(".class")) {
				continue;
			} else {
				try {
					String klassName = jarEntryName.replace(".class", "").replace("/", ".");
					//反射这个类
					Class<?> klass = Class.forName(klassName);
					//去掉是接口,注解等类
					if(!isClass(klass)) {
						continue;
					}
					//处理类
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void packageScan(String packageName) {
		String packageOppositePath = packageName.replace(".", "/");
		ClassLoader classLoder = Thread.currentThread().getContextClassLoader();
		Enumeration<URL> resource;
		try {
			resource = classLoder.getResources(packageOppositePath);
			//遍历本包中的所有文件
			while (resource.hasMoreElements()) {
				URL url = resource.nextElement();
				//判断是否为jar包中的包名称
				if (url.getProtocol().equals("jar")) {
					scanPackage(url);
				} else {
					File file = new File(url.toURI());
					if (!file.exists()) {
						continue;
					}
					scanPackage(packageName, file);
				}
			}
		} catch (URISyntaxException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值