包扫描的本质
包扫描的实质扫描的是所给包中的class文件,且jar包用普通包的扫描方法来扫描是不正确的。
实现包扫描的核心思路
给出一个需要扫描的包的名称,首先进行判断,该包是jar包还是普通包
public void packageScann(String PackageName) {
String rootname = "";
//将包名转换为目录形式
rootname = PackageName.replace('.', '/');
//通过给出的包名转换成的目录名称得到当前目录的URL
URL url = Thread.currentThread().getContextClassLoader().getResource(rootname);
//通过url.getProtocol().equals()方法来判断是File文件目录还是Jar包
if (url.getProtocol().equals("file")) {
try {
URI uri = url.toURI();
File file = new File(uri);
//已检测是目录路径,通过dealDirectory()方法来处理
dealDirectory(PackageName, file);
} catch (URISyntaxException e) {
e.printStackTrace();
}
} else if (url.getProtocol().equals("jar")) {
//否则是jar包,通过dealJarPackage()方法来处理,此方法只需URL作为参数
dealJarPackage(url);
}
}
处理普通包
处理目录路径dealDirectory()此时分成两种情况:一是已经是java的class文件,二是仍然未到最底层还是目录
public void dealDirectory(String PackageName, File file) {
//通过当前目录即参数中的File类型的file,可以得到当前目录下的所有文件
File[] fileList = file.listFiles();
//便利这个list,以此处理每一个file
for (File files : fileList) {
//判断是否仍是目录路径,若是,调用dealDirectory()方法
if (files.isDirectory()) {
//但对于参数中的PackageName路径要增加一层,即在末尾追加“.files.getName()”,一定要注意不能省略中间的“.”
dealDirectory(PackageName + "." + files.getName(), files);
}
//此时判断是否已经是class文件,即不再是目录,已经不再有分支
else if</