有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java反射获取包列表

我正在构建一个Java应用程序,它有许多不同的包。我希望能够以编程方式告诉应用程序中存在哪些以特定预修复程序开头的包。Java反射API是否有这样的功能?我没有看到任何与反射API相关的内容

例如:

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

我想通过知道前缀“com.app.controls”并理解一个新的包将来可能会被集成来列举所有这些

谢谢


共 (1) 个答案

  1. # 1 楼答案

    基于Sean's answer并使用反射获取包列表——可能忽略空包:

    /**
     * Finds all package names starting with prefix
     * @return Set of package names
     */
    public Set<String> findAllPackagesStartingWith(String prefix) {
        List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
        classLoadersList.add(ClasspathHelper.contextClassLoader());
        classLoadersList.add(ClasspathHelper.staticClassLoader());
        Reflections reflections = new Reflections(new ConfigurationBuilder()
                .setScanners(new SubTypesScanner(false), new ResourcesScanner())
                .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
                .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("my.base.package"))));
        Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);
    
        Set<String> packageNameSet = new TreeSet<String>();
        for (Class classInstance : classes) {
            String packageName = classInstance.getPackage().getName();
            if (packageName.startsWith(prefix)) {
                packageNameSet.add(packageName);
            }
        }
        return packageNameSet;
    }