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