classLoader初探(不知对否,欢迎指正,还要研究)

java的类加载机制(jvm规范)是委托模型,简单的说,如果一个类加载器想要加载一个类,首先它会委托给它的parent去加载,如果它的所有parent都没有成功的加载那么它才会自己亲自来,有点儿像儿子使唤老子的感觉。。jvm也拼爹啊,,,,,

在jvm中默认有三类loaer,bootstrap,ext,app,其中boot最大是爷爷,app最小是孙子,ext中间是爹。

它们有权限访问的classpath也不一样,boot是jdk或jre下面的lib目录,ext是jdk或jre的ext目录,而app是由用户指定的路径,比如用-cp参数指定的目录或jar。他们没有权力访问其他人的classpath,这样问题就来鸟,,,,可能有人会问狗司令大人闲得蛋疼啊,搞这么复杂,据说是为了安全考虑,避免用户的恶心意代码侵蚀jvm,,问题就是当bootstrap或ext想要加载用户指定classpath中的类就会失败,因为这俩货没有权限访问团app路径中的类的,,所以就搞了这么一个不伦不类的contextloader。。。。




接下来时代码测试:

packagemain;

 

importjava.net.URL;

importjava.net.URLClassLoader;

 

importjunit.framework.Test;

 

publicclass MainMethod {

 

   // TODO Auto-generated method stub

 

   public static void main(String[] args) 

    { 

        System.out.println("BootstrapClassLoader的加载路径:"); 

         

        //bootstrap方式的classLoader

        URL[] urls =sun.misc.Launcher.getBootstrapClassPath().getURLs(); 

        for(URL url : urls) 

            System.out.println(url); 

        System.out.println("----------------------------"); 

                 

        //取得扩展类加载器 

        URLClassLoader extClassLoader =(URLClassLoader)ClassLoader.getSystemClassLoader().getParent(); 

 

       System.out.println(extClassLoader); 

        System.out.println("扩展类加载器 的加载路径:"); 

         

        urls = extClassLoader.getURLs(); 

        for(URL url : urls) 

            System.out.println(url); 

         

       System.out.println("----------------------------"); 

                  

         

        //取得应用(系统)类加载器 

        URLClassLoader appClassLoader =(URLClassLoader)ClassLoader.getSystemClassLoader(); 

         

       System.out.println(appClassLoader); 

        System.out.println("应用(系统)类加载器 的加载路径: "); 

         

        urls = appClassLoader.getURLs(); 

        for(URL url : urls) 

            System.out.println(url); 

                 

       System.out.println("----------------------------");  

    } 

 

}

Console:

BootstrapClassLoader的加载路径:

file:/D:/java/jre/lib/resources.jar

file:/D:/java/jre/lib/rt.jar

file:/D:/java/jre/lib/sunrsasign.jar

file:/D:/java/jre/lib/jsse.jar

file:/D:/java/jre/lib/jce.jar

file:/D:/java/jre/lib/charsets.jar

file:/D:/java/jre/lib/modules/jdk.boot.jar

file:/D:/java/jre/classes

----------------------------

sun.misc.Launcher$ExtClassLoader@42e816

扩展类加载器 的加载路径:

file:/D:/java/jre/lib/ext/dnsns.jar

file:/D:/java/jre/lib/ext/localedata.jar

file:/D:/java/jre/lib/ext/sunjce_provider.jar

file:/D:/java/jre/lib/ext/sunmscapi.jar

file:/D:/java/jre/lib/ext/sunpkcs11.jar

----------------------------

sun.misc.Launcher$AppClassLoader@addbf1

应用(系统)类加载器 的加载路径:

file:/D:/GIT/test/WebRoot/WEB-INF/classes/

file:/D:/GIT/test/WebRoot/WEB-INF/lib/commons-logging-1.0.4.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/log4j-1.2.15.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/mysql-connector-java-5.0.8-bin.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/ojdbc14.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/servlet-api.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.aop-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.asm-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.beans-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.context-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.context.support-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.core-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.expression-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.jdbc-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.orm-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.transaction-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.web-3.0.5.jar

file:/D:/GIT/test/WebRoot/WEB-INF/lib/spring.web.servlet-3.0.5.jar

file:/D:/eclipse%20For%20Web/plugins/org.junit_4.11.0.v201303080030/junit.jar


参考blog:http://blog.csdn.net/irelandken/article/details/7048817






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值