page contents

ClassLoader 如何查找路径?

Pack 发布于 2020-02-27 16:29
阅读 1089
收藏 0
分类:WEB前端开发

attachments-2020-02-21UMjErC5e577d85df524.pngattachments-2020-02-qN1yM0jd5e577d8e50a55.png

attachments-2020-02-IPBMJybS5e577d966729c.png


classpath:mysql

classpath:oracle


为什么不是classpath的绝对路劲加上/oracle或者/mysql呢

他是怎么找这个路劲的?

我知道双亲委派和沙箱机制,不要笼统和我讲这么两个概念,因为我还是没懂为啥会是这种情况?求教!在线等

475
Pack
Pack

首先,我们要达成一个基础的共识是,Thread.currentThread().getContextClassLoader(). 通过这段代码可以获得当前线程的一个类加载器。然后通过getResource方法去类加载器找到resourceName这个文件的相对路径


我们可以找到getResource()这段代码,从这段代码可以看到,它的加载顺序是:先去父加载器去加载资源文件,如果找不到,则会去BootstrapLoader中去找。如果还是找不到,才会调用当前类的classLoader去找。这就是双亲委派。当资源被找到之后,就会返回改文件的URL地址。


public URL getResource(String name) {

        URL url;

        if (parent != null) {

            url = parent.getResource(name);

        } else {

            url = getBootstrapResource(name);

        }

        if (url == null) {

            url = findResource(name);

        }

        return url;

    }

JVM中内置了三个重要的ClassLoader,分别是BootstrapClassLoader、ExtensionClassLoader、AppClassLoader 这三个类加载器分别会加载不同路径下的class文件。


BootstrapClassLoader负责JVM运行时的核心类, JAVA_HOME/lib/

ExtensionClassLoader负责加载JVM扩展类,JAVA_HOME/lib/ext/*.jar

AppClassLoader 负责加载classpath路径下的jar或者目录


所以,你通过当前线程的类加载器来加载资源时,输出的路径会不一样,原因就是因为用到了不同的加载器,比如最后一个oracle,应该是使用了BootstrapClassLoader; mysql,采用了AppClassLoader

请先 登录 后评论