在Java中,Classpath是指一组文件夹和JAR文件,它们包含了Java类和资源。要获取Classpath中的所有类,可以使用以下方法:
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class ClasspathScanner {
public static void main(String[] args) throws IOException, ClassNotFoundException {
List<Class<?>> classes = getClasses();
for (Class<?> clazz : classes) {
System.out.println(clazz.getName());
}
}
public static List<Class<?>> getClasses() throws IOException, ClassNotFoundException {
List<Class<?>> classes = new ArrayList<>();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Enumeration<URL> resources = classLoader.getResources("");
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
String protocol = resource.getProtocol();
if ("file".equals(protocol)) {
// 本地文件系统
String path = resource.getPath();
classes.addAll(findClasses(path, classLoader));
} else if ("jar".equals(protocol)) {
// JAR文件
String path = resource.getPath();
classes.addAll(findClassesInJar(path, classLoader));
}
}
return classes;
}
private static List<Class<?>> findClasses(String path, ClassLoader classLoader) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<>();
File root = new File(path);
if (root.isDirectory()) {
for (File file : root.listFiles()) {
if (file.isDirectory()) {
classes.addAll(findClasses(file.getAbsolutePath(), classLoader));
} else if (file.getName().endsWith(".class")) {
String className = file.getAbsolutePath().substring(path.length() + 1, file.getAbsolutePath().length() - ".class".length()).replace(File.separator, ".");
classes.add(Class.forName(className, false, classLoader));
}
}
}
return classes;
}
private static List<Class<?>> findClassesInJar(String path, ClassLoader classLoader) throws IOException, ClassNotFoundException {
List<Class<?>> classes = new ArrayList<>();
String jarPath = path.substring("file:".length(), path.indexOf("!"));
try (JarFile jarFile = new JarFile(jarPath)) {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().endsWith(".class")) {
String className = entry.getName().substring(0, entry.getName().length() - ".class".length()).replace("/", ".");
classes.add(Class.forName(className, false, classLoader));
}
}
}
return classes;
}
}
import org.apache.commons.lang3.ClassPath;
import java.io.IOException;
import java.util.List;
public class ClasspathScanner {
public static void main(String[] args) throws IOException {
List<Class<?>> classes = getClasses();
for (Class<?> clazz : classes) {
System.out.println(clazz.getName());
}
}
public static List<Class<?>> getClasses() throws IOException {
List<Class<?>> classes = ClassPath.from(Thread.currentThread().getContextClassLoader()).getTopLevelClasses();
return classes;
}
}
这两种方法都可以获取Classpath中的所有类。第一种方法使用Java反射API,适用于大多数情况。第二种方法使用了第三方库,可以更方便地获取类信息。
领取专属 10元无门槛券
手把手带您无忧上云