You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java9+如何获取系统模块(如java.base)下指定包的所有类名?

Java 11扫描系统包返回空集合的问题验证

问题现象

  • Java 8环境下,三种包扫描方法对**自定义包(如com.xxx类)和系统包(如java.util)**均能正常工作,返回对应包下的类集合
  • Java 11环境下,三种方法仅对自定义包有效,扫描系统包时返回空集合

测试代码

public class AccessingAllClassesInPackage {

    public Set<Class> findAllClassesUsingClassLoader(String packageName) {
        InputStream stream = ClassLoader.getSystemClassLoader()
                .getResourceAsStream(packageName.replaceAll("[.]", "/"));
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        return reader.lines()
                .filter(line -> line.endsWith(".class"))
                .map(line -> getClass(line, packageName))
                .collect(Collectors.toSet());
    }

    private Class getClass(String className, String packageName) {
        try {
            return Class.forName(packageName + "."
                    + className.substring(0, className.lastIndexOf('.')));
        } catch (ClassNotFoundException e) {
            // handle the exception
        }
        return null;
    }

    public Set<Class> findAllClassesUsingReflectionsLibrary(String packageName) {
        Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
        return reflections.getSubTypesOf(Object.class)
                .stream()
                .collect(Collectors.toSet());
    }

    public Set<Class> findAllClassesUsingGoogleGuice(String packageName) throws IOException {
        return ClassPath.from(ClassLoader.getSystemClassLoader())
                .getAllClasses()
                .stream()
                .filter(clazz -> clazz.getPackageName()
                        .equalsIgnoreCase(packageName))
                .map(clazz -> clazz.load())
                .collect(Collectors.toSet());
    }
}

public class DemoApplication {

    public static void main(String[] args) throws IOException {

        String packageA = "com.google.common.reflect";
        String packageB = "java.util";

        AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage();

        Set<Class> classesA = instance.findAllClassesUsingClassLoader(packageB);

        Set<Class> classesB = instance.findAllClassesUsingReflectionsLibrary(packageB);

        Set<Class> classesC = instance.findAllClassesUsingGoogleGuice(packageB);

        System.out.println("args = " + Arrays.deepToString(args));
    }
}

内容的提问来源于stack exchange,提问作者zhan yongqiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:55:32