通过项目下的包名获取包下的全部类
关键点:
ClassLoader.getResources()
返回给定包目录下所有资源。
是一个非静态方法,它只能通过类对象访问,如果我们尝试使用类名访问方法,那么我们将得到一个错误。
方法可能在返回资源时抛出异常。
方法的返回类型是Enumeration,它返回用于扫描资源的 URL 对象的枚举,否则当给定的资源不存在时返回 null。
public static Set classes = new HashSet<>();
public static void main(String[] args) {
String packageName = "cn.jet";
Enumeration<URL> dirs = null;
try {
dirs = Thread.currentThread().getContextClassLoader().getResources(packageName.replace(".", "/"));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(dirs);
while (dirs.hasMoreElements()) {
//获取物理路径
System.out.println("ssss");
String filePath = dirs.nextElement().getFile();
System.out.println(filePath);
findClassByPackageName(filePath,packageName,classes);
}
}
public static void findClassByPackageName(String classPath, String rootPackageName, Set classes) {
File file = new File(classPath);
if (!file.exists())
return;
if (file.isDirectory()) {
File[] list = file.listFiles();
//如果是文件夹就需要在包名后面添加文件名
for (File path : list) {
if (path.isDirectory()) {
findClassByPackageName(path.getAbsolutePath(), rootPackageName + "." + path.getName(), classes);
} else {
findClassByPackageName(path.getAbsolutePath(), rootPackageName, classes);
}
}
} else {
if (file.getName().endsWith(".class")) {
String className = file.getName().substring(0, file.getName().length() - 6);
try {
System.out.println(rootPackageName + '.' + className);
classes.add(Thread.currentThread().getContextClassLoader().loadClass(rootPackageName + '.' + className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}