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
相关产品推荐
相关产品推荐

