已经知道java有三个级别的类加载器,Bootstrap class loader,extension class loader 和 system class loader! 这三个级别的类加载器是以父-子关系来组织的。同时,Bootstrap class loader位于最后级别,system class loader为于最低的级别
简单的说,Bootstrap class loader加载的是jre/classes下类,以及jre/lib下的rt.jar等等。
extension class loader 加载的时候 jre/lib/ext目录下的类包
system class loader 加载的是默认的class路径已经在环境变量中设置的CLASSPATH路径的类
同时,类的加载是运用“委托模式”(delegation model),简单的说,Bootstrap class loader能加载,就Bootstrap class loader加载,如果Bootstrap class loader不能加载,就让extension class loader 加载,如果extension class loader不能加载,就让system class loade加载,如果system class loader也不能加载,就报出ClassNotFoundException
举例来说:
有一Out.java,源代码如下:
放置在E:\Lesson目录下。
通过命令行格式,进入E:\Lesson目录下,执行
[quote]
java Out
[/quote]
可以得出结果:
不更改E:\Lesson目录下的Out.class文件,在别的目录下新建一个Out.java
编译后把得到的Out.class放置在jdk的jre/classes目录下(如果没有,新建一个classes目录),
再进入到E:\lesson目录下执行
得出的:
可以看出委托模式的加载方式
简单的说,Bootstrap class loader加载的是jre/classes下类,以及jre/lib下的rt.jar等等。
extension class loader 加载的时候 jre/lib/ext目录下的类包
system class loader 加载的是默认的class路径已经在环境变量中设置的CLASSPATH路径的类
同时,类的加载是运用“委托模式”(delegation model),简单的说,Bootstrap class loader能加载,就Bootstrap class loader加载,如果Bootstrap class loader不能加载,就让extension class loader 加载,如果extension class loader不能加载,就让system class loade加载,如果system class loader也不能加载,就报出ClassNotFoundException
举例来说:
有一Out.java,源代码如下:
public class Out{
public static void main(String[] args) throws Exception{
for(int i=0;i<10;i++){
System.out.println("Test...."+i);
}
}
}
放置在E:\Lesson目录下。
通过命令行格式,进入E:\Lesson目录下,执行
[quote]
java Out
[/quote]
可以得出结果:
Test....0
Test....1
Test....2
Test....3
Test....4
Test....5
Test....6
Test....7
Test....8
Test....9
不更改E:\Lesson目录下的Out.class文件,在别的目录下新建一个Out.java
public class Out{
public static void main(String[] args) throws Exception{
System.out.println("=====this is started by top classloader=====");
}
}
编译后把得到的Out.class放置在jdk的jre/classes目录下(如果没有,新建一个classes目录),
再进入到E:\lesson目录下执行
java Out
得出的:
=====this is started by top classloader=====
可以看出委托模式的加载方式