包扫描(普通包和jar包)

包扫描,在反射机制调用某些加注解的类或方法时,利用包扫描的方法定位到它们
因为运用的场景类似,可以将代码打包成工具,方便之后调用。

package com.wy.packagescanner.core;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URI;
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 void PackageScanning(String packageName) {
		String rootName = packageName;
		//将包名称更改为路径的格式
		packageName = packageName.replace(".", "/");
		URL url = Thread.currentThread().getContextClassLoader().getResource(packageName);
		//判断文件的属性是file还是jar
		if (url.getProtocol().equals("file")) {
			try {
				URI uri = url.toURI();
				File file = new File(uri);
				//处理目录文件
				dealDirectory(file, rootName);
			} catch (URISyntaxException e) {
				e.printStackTrace();
			}
		}
		//处理jar文件
		dealJarFile(url);
	}

	private void dealJarFile(URL url) {
		try {
			JarURLConnection connection = (JarURLConnection) url.openConnection();
			JarFile jarFile = connection.getJarFile();
			Enumeration<JarEntry> jarEntries = jarFile.entries();
			while (jarEntries.hasMoreElements()) {
				JarEntry jarEntry = jarEntries.nextElement();
				//筛选出.class文件,其他文件不予处理
				if (jarEntry.isDirectory() || !jarEntry.getName().endsWith(".class")) {
					continue;
				}
				String jarName = jarEntry.getName();
				//这里将文件路径格式更改为类名称格式
				jarName = jarName.replace("/", ".");
				jarName = jarName.replace(".class", "");
				
				Class<?> klass = Class.forName(jarName);
				//运用抽象方法将得到的类交由工具外的用户处理
				dealKlass(klass);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}

	//处理目录
	private void dealDirectory(File curFile, String rootPackage) {
		File[] fileList = curFile.listFiles();
		for (File file : fileList) {
			if (file.isDirectory()) {
				//如果该文件还是目录,则递归继续向下查找.class文件
				dealDirectory(file, rootPackage +"." + file.getName());
			} else if (file.isFile()) {
				dealClassFile(rootPackage, file);
			}
			
		}
	}
	//将klass用抽象方法交由用户处理
	public abstract void dealKlass(Class<?> klass);
	
	private void dealClassFile(String rootPackage, File file) {
		String fileName = file.getName();
		if (fileName.endsWith(".class")) {
			fileName = fileName.replace(".class", "");
			
			try {
				Class<?> klass = Class.forName(rootPackage + "." + fileName);
				//筛出该类是注解、枚举、接口、八大基本类型
				if (klass.isAnnotation() || klass.isEnum() 
						||klass.isInterface() || klass.isPrimitive()
						) {
					return;
				}
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}
}

测试结果:输入:com.google.gson 这个jar包名称
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值