如描述所述:如何获取给定包名称的所有Java类文件的列表。
我在SO和其他站点上看到了很多问题和方法,可以找到特定Java包中的所有类。大多数解决方案都不适合我。有时,他们使用Jar文件,但不能处理文件夹中的“普通” Java项目(例如IDE的执行方式)或其他方法。因此,我将所有这些代码片段放在一起,形成了一个解决方案,无论该代码是在Jar文件中还是在简单的文件夹结构中,它对我来说都是开箱即用的。
这确实很简单:为该方法提供getClassesInPackage
要检查的包的名称,然后将获得此包中所有类的列表。当前,有序地“消费”没有例外。
玩得开心!这是代码:
public static final List<Class<?>> getClassesInPackage(String packageName) {
String path = packageName.replaceAll("\\.", File.separator);
List<Class<?>> classes = new ArrayList<>();
String[] classPathEntries = System.getProperty("java.class.path").split(
System.getProperty("path.separator")
);
String name;
for (String classpathEntry : classPathEntries) {
if (classpathEntry.endsWith(".jar")) {
File jar = new File(classpathEntry);
try {
JarInputStream is = new JarInputStream(new FileInputStream(jar));
JarEntry entry;
while((entry = is.getNextJarEntry()) != null) {
name = entry.getName();
if (name.endsWith(".class")) {
if (name.contains(path) && name.endsWith(".class")) {
String classPath = name.substring(0, entry.getName().length() - 6);
classPath = classPath.replaceAll("[\\|/]", ".");
classes.add(Class.forName(classPath));
}
}
}
} catch (Exception ex) {
// Silence is gold
}
} else {
try {
File base = new File(classpathEntry + File.separatorChar + path);
for (File file : base.listFiles()) {
name = file.getName();
if (name.endsWith(".class")) {
name = name.substring(0, name.length() - 6);
classes.add(Class.forName(packageName + "." + name));
}
}
} catch (Exception ex) {
// Silence is gold
}
}
}
return classes;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句