Java反射 - 获取包列表

Der*_*ard 11 java reflection

我正在构建一个包含许多不同包的Java应用程序.我希望能够以编程方式告诉应用程序中存在哪些软件包以特定的预修复程序开头.无论如何使用Java反射API执行此操作?我没有看到与反射apis相关的任何事情.

例:

com.app.controls.text
com.app.controls.picker
com.app.controls.date
etc
Run Code Online (Sandbox Code Playgroud)

我想通过知道前缀"com.app.controls"并了解将来可能集成新包来枚举所有这些.

谢谢!

Sea*_*lly 19

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

这是一个简单的例子:

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

请注意,此技术仅返回当前类加载器中定义的包.如果您需要来自不同类加载器的包,则有一些选项:

  1. 安排一些事情,以便您的程序可以从该类加载器内部运行上述代码.这需要某个组织到您的代码库,这可能是也可能是不可行的.

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