zoukankan      html  css  js  c++  java
  • 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下包含的类,截图

  • 相关阅读:
    PAT Basic 1001
    PAT基础6-11
    PAT基础6-12
    PAT基础6-10
    修改正在进行遍历的列表
    使用管道和cronolog切割日志
    python logging模块
    python实现广度优先搜索和深度优先搜索
    多继承下的super()指向的不一定是直接父类
    python3 pandas DataFrame常见用法
  • 原文地址:https://www.cnblogs.com/potatsoSec/p/13151141.html
Copyright © 2011-2022 走看看