java 包扫描器,扫描指定包下的所有java文件,并返回class数组。
直接上代码
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedList;
public class PackageScanner {
private String packageName;
/**
* 开始扫描指定包下的类,并返回
* packageName -包名,例如 xx.xxx.xxx
*/
public Class<?>[] scan(String packageName) throws URISyntaxException, ClassNotFoundException{
this.packageName = packageName;
URL url = Thread.currentThread().getContextClassLoader().getResource(packageName.replace('.', File.separatorChar));
assert url != null;
File file = new File(url.toURI());
return scanFile(file);
}
/**
* 扫描文件,这里不使用递归,使用出栈入栈方式遍历
*/
private Class<?>[] scanFile(File file) throws ClassNotFoundException {
LinkedList<Class<?>> classList = new LinkedList<>();
LinkedList<File> fileList = new LinkedList<>();
fileList.push(file);
while(!fileList.isEmpty()){
File targetFile = fileList.pop();
if(targetFile.isFile() && targetFile.getName().endsWith(".class")){
//获取绝对路径
String path = targetFile.getAbsolutePath();
//获取包路径
String packagePath = path.substring(path.indexOf(this.packageName.replace('.', File.separatorChar)));
//处理包路径,变成包名的格式
String className = packagePath.replace(File.separatorChar, '.');
if(className.endsWith(".class")){
className = className.substring(0, className.lastIndexOf("."));
}
//添加class到集合中
classList.push(Class.forName(className));
}else if(targetFile.isDirectory()){
fileList.addAll(Arrays.asList(Objects.requireNonNull(targetFile.listFiles())));
}
}
return classList.toArray(new Class[0]);
}
}
使用:
public class Main {
public static void main(String[] args) throws ClassNotFoundException, URISyntaxException {
// TODO Auto-generated method stub
PackageScanner ps = new PackageScanner();
Class clazz[] = ps.scan("cn.enncy.demo");
for (Class c : clazz) {
System.out.println(c);
}
}
}
输出
class cn.enncy.demo.scan.PackageScanner
class cn.enncy.demo.main.Main