小编典典

Java Reflection-获取软件包列表

java

我正在构建一个具有许多不同程序包的Java应用程序。我希望能够以编程方式告诉应用程序中存在哪些以特定前缀开头的软件包。无论如何,Java反射API可以做到这一点吗?我没有看到任何与反射API相关的信息。

例:

com.app.controls.text
com.app.controls.picker
com.app.controls.date
etc

我想通过知道前缀“ com.app.controls”来枚举所有这些信息,并了解将来可能会集成一个新程序包。

谢谢!


阅读 225

收藏
2020-11-23

共1个答案

小编典典

您可以使用Package.getPackages()来执行此操作,该方法返回当前类加载器已知的所有软件包的数组。您必须手动遍历数组,并使用getName()查找具有适当前缀的数组。

这是一个简单的例子:

public List<String> findPackageNamesStartingWith(String prefix) {
    return Package.getPackages().stream()
        .map(Package::getName)
        .filter(n -> n.startsWith(prefix))
        .collect(toList());
}

请注意,此技术将仅返回在当前类加载器中定义的包。如果您需要来自其他类加载器的软件包,则有一些选择:

  1. 进行安排,以便您的程序可以从该类加载器内部运行以上代码。这要求您的代码库有一定的组织,这可能可行,也可能不可行。

  2. 使用反射在适当的类加载器上调用(通常受保护的)方法getPackages()。如果程序在安全管理器下运行,则此方法将无效。

2020-11-23