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