java 获取包下的类 find all classes in a package

群里有个人问的,java下怎么获取指定包下的类。例如获取java.lang包下都包含什么类。

classloader

java的classloader为双亲委派模式。但是只能获取到用户编写的类,并不能获取到诸如java.lang等系统包下的类。在java中,java.lang等包是由bootstrap classloader去负责加载。
Bootstrap ClassLoader称为启动加载器,是Java类中加载层次最顶层的类加载器,负责加载JDK中的核心类库,如rt.jar,resources.jar,charsets.jar等。bootstrap classloader由c++编写,在java中是无法访问的。既然无法访问,我们就无法通过反射等方法去获取系统核心包下包含的类。

访问jar包

通过classloader获取加载的package,然后通过Reflection扫描包中的类即可

代码如下

        List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
        classLoadersList.add(ClasspathHelper.contextClassLoader());
        classLoadersList.add(ClasspathHelper.staticClassLoader());

        Reflections reflections = new Reflections(new ConfigurationBuilder()
                .setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
                .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
                .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("org.example"))));
        Set<Class<? extends Object>> allClasses =
                reflections.getSubTypesOf(Object.class);
        allClasses.stream().forEach(System.out::println);

这种方法可以获取java.lang下包含的类,截图

posted @ 2020-06-17 10:48  potatso  阅读(1073)  评论(0编辑  收藏  举报