不幸的是,Java 没有提供一种在“本机”JRE 中列出类的简单方法。这给您留下了两个选项: (a)对于任何给定的 JAR 文件,您可以列出该 JAR 文件中的条目,找到 .class文件,然后确定每个 .class文件代表哪个 Java 类; 或者(b)您可以使用一个库来完成这项工作。
选项(a) : 手动扫描 JAR 文件
在这个选项中,我们将使用包含在位于 /path/to/jar/file.jar的 jar 文件中的所有 Java 类的列表填充 classNames。
List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
// This ZipEntry represents a class. Now, what class does it represent?
String className = entry.getName().replace('/', '.'); // including ".class"
classNames.add(className.substring(0, className.length() - ".class".length()));
}
}
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
反光
我没有亲自使用 反思图书馆,但它似乎很受欢迎。网站上提供了一些很好的例子,比如这种加载 任何 JAR 文件提供的包中所有类的快速方法,这对您的应用程序可能也很有用。