Java扫描包并加载Class类
- 类似SpringBean的扫描某个包下的类并加载;
- 指定某个包下类的实例化并进行管理,用于快速main方法测试;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*;
import java.util.function.Predicate;
/**
* 简易类扫描加载(只描述原理自行理解)
* 注:这里只简单加载了一层文件的,有多需求可以改写文件处理
*
* @author caoch
*/
public class ClassScanLoad {
/**
* 扫描过滤后实例化类
*
* <pre>
* 示例:
* String scanPackage = "com.ttk.agg.cy.base.task.process";
* instanceClassByScanFilter(scanPackage, StringTextEtlProcess.class, null);
* </pre>
*
* @param scanPackage 扫描包
* @param resultCls 结果类型,同时也是过滤类型,这些类型必须继承自某一接口或抽象类
* @param filter 过滤器
* @param <R> 实例化类型
* @return 实例化类
*/
public static <R> Set<R> instanceClassByScanFilter(String scanPackage, Class<R> resultCls, Predicate<Class<?>> filter) {
return filterAndInstanceClass(resultCls, getUrlOfScanPackage(scanPackage), filter);
}
public static <R> Set<R> filterAndInstanceClass(
Class<R> resultCls, Set<String> clsNameSet, Predicate<Class<?>> filter) {
try {
Set<R> rs = new HashSet<>();
for (String clsName : clsNameSet) {
Class<?> aClass = Class.forName(clsName);
if (resultCls.isAssignableFrom(aClass)) {
if (filter == null || filter.test(aClass)) {
Object cast = aClass.cast(aClass.newInstance());
rs.add(resultCls.cast(cast));
}
}
}
return rs;
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static Set<String> getUrlOfScanPackage(String scanPackage) {
String scanPackageUrl = scanPackage.replace(".", "/");
Set<String> clsNameSet = new HashSet<>();
try {
Enumeration<URL> resources = ClassScanLoad.class
.getClassLoader().getResources(scanPackageUrl);
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
if ("file".equals(url.getProtocol())) {
File file = new File(url.toURI());
// System.out.println(file.getPath());
if (file.exists() && file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File clsFile : files) {
if (clsFile.exists() && !clsFile.isDirectory()) {
// System.out.println(clsFile.getName());
String clsFileName = clsFile.getName();
if (clsFileName.endsWith(".class")) {
String clsUrlName = scanPackage + "." + clsFileName.replace(".class", "");
clsNameSet.add(clsUrlName);
}
}
}
}
}
}
}
return clsNameSet;
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
/**
* 递归文件夹
*/
private static List<File> fileDepth(File file, Predicate<File> fileFilter) {
List<File> list = null;
if (file.exists()) {
if (fileFilter == null || fileFilter.test(file)) {
// 是否目录
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
list = new ArrayList<>(files.length);
for (File clsFile : files) {
List<File> depthFiles = fileDepth(clsFile, fileFilter);
if (!depthFiles.isEmpty()) {
list.addAll(depthFiles);
}
}
}
} else {
list = new ArrayList<>(1);
list.add(file);
}
}
}
if (list == null) {
list = new ArrayList<>(0);
}
return list;
}
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。