• ClassLoader加载资源时的搜索路径


    先来个例子:

        /**
         * 测试classloader加载路径在哪里<p>
         * main3
         */
        public static void main3(String[] args)
        {
            Properties props = new Properties();
            //在src中的dyan/sendhttp包路径下
    //        InputStream is = TestSendHttp.class.getClassLoader().getResourceAsStream("dyan/sendhttp/dyan.txt");
            //在src下
            InputStream is = TestSendHttp.class.getClassLoader().getResourceAsStream("dyan.txt");
            
            //展示类加载器的父加载器,可以肯定是ExtClassLoader
            System.out.println(TestSendHttp.class.getClassLoader().getParent().toString());
            
            try 
            {
                props.load(is);
                String auther = props.get("auther").toString();
                System.out.println(auther);
            } 
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

    资源路径:

    不管上面用哪个输入流,都可以读取dyan.txt中的auther内容。

    结论:

    从上面的结果可以看出,AppClassLoader的搜索资源路径是相对于src的编译后路径。

    如我的机器src的编译后路径是TestProject/bin,则AppClassLoader的搜索资源路径就包括

    E:core_wkspaceTestProjectin。

    类加载器

    JVM是通过一个称为ClassLoader东西来加载Class文件的,每当JVM启动,

    它就会生成三个ClassLoader,它们分别是BootstrapLoader, ExtClassLoader 和AppClassLoader。

    这三个ClassLoader作用是不同的,它们所加载的class文件也是不同的。

    BootstrapLoader是用C++语言实现的,它所加载的是JVM中最底层的类,它加载时的搜索路径是由sun.boot.class.path所指定的。

    System.getProperty("sun.boot.class.path").split(";");

    D: oolsJavajdk1.7.0_17jrelib esources.jar
    D: oolsJavajdk1.7.0_17jrelib t.jar
    D: oolsJavajdk1.7.0_17jrelibsunrsasign.jar
    D: oolsJavajdk1.7.0_17jrelibjsse.jar
    D: oolsJavajdk1.7.0_17jrelibjce.jar
    D: oolsJavajdk1.7.0_17jrelibcharsets.jar
    D: oolsJavajdk1.7.0_17jrelibjfr.jar
    D: oolsJavajdk1.7.0_17jreclasses

    ExtClassLoader是用来加载java的一些库的,它加载时的搜索路径是由java.ext.dirs来决定的,该加载器在加载时不同于其他加载器,

    它加载时会搜索指定路径下的所有子目录,也就是说它会搜索java.ext.dirs所指定下的所有子目录下的class文件或jar文件。

    同时也可以用参数-Djava.ext.dirs来改变它的搜索路径。

    System.getProperty("java.ext.dirs").split(";");

    D: oolsJavajdk1.7.0_17jrelibext
    C:WindowsSunJavalibext

    AppClassLoader也称SystemClassLoader, 它的搜索路径是由java.class.path来指定的,

    注意:AppClassLoader不会搜索java.class.path下的子目录的,所以在在加载子目录中的

    资源文件时要指定相对目录,如最开始的那个例子。

    System.getProperty("java.class.path").split(";");

    E:core_wkspaceTestProjectin
    E:core_wkspacecallProcedurein
    E:core_wkspacecallProcedurelibc3p0-0.9.1.2.jar
    E:core_wkspacecallProcedurelibcommons-io-2.4.jar
    E:core_wkspacecallProcedurelibdom4j-1.6.1.jar
    E:core_wkspacecallProcedurelibfastjson-1.1.37.jar
    E:core_wkspacecallProcedureliblog4j-1.2.17.jar
    E:core_wkspacecallProcedureliblog4j-api-2.1.jar
    E:core_wkspacecallProcedureliblog4j-core-2.1.jar
    E:core_wkspacecallProcedureliblog4j2Mgr.jar
    E:core_wkspacecallProcedurelibojdbc6-11.1.0.7.jar

    关系:

         类加载的机制是,全盘负责委托机制,全盘负责即如果AppCalssLoader要加载一个类文件,除非显示指定另一个加载器,不然

    这个类文件以及此文件所依赖和引用的类,都由AppClassLoader负责加载。 委托即AppClassLoader如果没有加载过String类,

    就先委托父类加载器ExtClassLoader加载String类,(由委托机制ExtClassLoader委托BootStrapLoader加载String类,String

    类在rt.jar中,所有由BootStrapLoader加载String类)。只有在父类加载器找不到字节码文件的情况下才从AppClassLoader的类路径

    中查找并装载目标类(如上面的TestProject工程中的TestSendHttp.class)

  • 相关阅读:
    转:VScode+Latex+SumatraPDF反向搜索失败解决办法
    Hierarchical Multilabel Classification (HMC)的定义
    Atomikos
    TCP四次挥手
    多种方式使用js填充[0, 1, 2, ...., 99]
    输入URL到页面渲染整个流程
    手写Promise
    奇安信——C++代码安全服务器开发一、二面
    元戎启行——C++后端研发岗一面——一面挂
    欢乐互娱——C++服务器开发一面——一面挂
  • 原文地址:https://www.cnblogs.com/ahudyan-forever/p/6007458.html
Copyright © 2020-2023  润新知