遍历当前项目下某个包下所有类
思路
1.遍历包下所有的类,实际就是先找到包对应的文件路径,然后根据文件路径找到对应文件夹,然后对文件夹进行遍历
2. 类都是以*.class* 结尾,故只要找到包文件夹下所有.class文件即可
3. 部分*$*.class为内部类或者匿名类,遍历的时候可进行过滤
4. 有时候以jar包形式部署,考虑文件类型为jar包,思路类似
代码实现
// 包名
String packageName = "com.el.canno.utils";
// 包相对路径
String packagePath = packageName.replace(".","/");
// 资源URL
URL url = ClassLoader.getSystemResource("");
// 问价协议一般为 file or jar
if("file".equals(url.getProtocol())) {
File[] files = new File(url.getPath() + packagePath)
.listFiles(file -> file.getName().endsWith(".class") || file.isDirectory());
for(File file : files){
// 文件夹,可递归遍历,此处省略
if(file.isDirectory()){
continue;
}
// 输出类名称
System.out.println(file.getName().replace(".class",""));
}
}else if("jar".equals(url.getProtocol())){
// 获取jar包
JarFile jarFile =((JarURLConnection) url.openConnection()).getJarFile();
// 拿到jar包下所有文件
Enumeration<JarEntry> entries = jarFile.entries();
// 根据包名过滤文件
while (entries.hasMoreElements()){
JarEntry entry = entries.nextElement();
if(entry.getName().startsWith(packagePath) || entry.getName().endsWith(".class")){
String name = entry.getName().replace(packagePath,"").replace(".class","");
// 包下文件夹,此处不遍历
if(name.contains("/")){
continue;
}
System.out.println(name);
}
}
}