Java代码扫描包下所有类
Java代码扫描包下所有类
package top.littlefogcat.pluginization;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class ClassUtil {
/**
* 根据传入的根包名,扫描该包下所有类
*
* @param thiz this
* @param rootPackageName 包名
*/
public static List<String> scanClasses(Object thiz, String rootPackageName) {
return scanClasses(thiz.getClass(), rootPackageName);
}
/**
* 根据传入的根包名,扫描该包下所有类
*
* @param thisClass 所在类
* @param rootPackageName 包名
*/
public static List<String> scanClasses(Class<?> thisClass, String rootPackageName) {
return scanClasses(Objects.requireNonNull(thisClass.getClassLoader()), rootPackageName);
}
/**
* 根据传入的根包名和对应classloader,扫描该包下所有类
*/
public static List<String> scanClasses(ClassLoader classLoader, String packageName) {
try {
String packageResource = packageName.replace(".", "/");
URL url = classLoader.getResource(packageResource);
File root = new File(url.toURI());
List<String> classList = new ArrayList<>();
scanClassesInner(root, packageName, classList);
return classList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 遍历文件夹下所有.class文件,并转换成包名字符串的形式保存在结果List中。
*/
private static void scanClassesInner(File root, String packageName, List<String> result) {
for (File child : Objects.requireNonNull(root.listFiles())) {
String name = child.getName();
if (child.isDirectory()) {
scanClassesInner(child, packageName + "." + name, result);
} else if (name.endsWith(".class")) {
String className = packageName + "." + name.replace(".class", "");
result.add(className);
}
}
}
}
保持微笑,时刻冷静,相信自己也相信队友,坚持信念
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现