ClassLoader的委托模型

来源:互联网 发布:ubuntu 刻录光盘 编辑:程序博客网 时间:2024/05/16 17:37

来源:http://www.blogdriver.com/eis/332162.html

1:BootStrapClassLoader  :加载java运行过程中的核心类库JRE/lib/rt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.jar 以及存放在JRE/classes里的类
2:ExtClassLoader           :加载JRE/lib/ext 或者目录下的库文件目录下的类(包括任何子目录,有别于其他两个ClassLoader)
3:AppClassLoader          :加载CLASSPATH变量指定路径下的类
 
A、其中AppClassLoader的parent(并非父类)为ExtClassLoader, ExtClassLoader的parent为BootStrapClassLoader,根据ClassLoader的委托模型,当要加载一个class时候会先让其parent来加载,如果parent找不到的话,再由自己来加载。
B、加载的第一个类的ClassLoader如果为BootStrapClassLoader的话,那么其他的所有类也必须又BootStrapClassLoader来加载,如果加载第一个类的ClassLoader为AppClassLoader的话,则类的加载按规则A来执行。
 
BootStrapClassLoader的默认Load路径可以通过 System.getProperty("sun.boot.class.path");来取得
ExtClassLoader的默认Load路径可以通过 System.getProperty("java.ext.dirs");来取得
AppClassLoader的默认Load路径可以通过 System.getProperty("java.class.path");来取得
 
其中ExtClassLoader,AppClassLoader的load可以通过命令:java -Djava.ext.dirs xxx xxx,java -Djava.class.path xxx xxx来改变
而BootStrapClassLoader的路径是用C++写死在JVM里面的,即使通过java -Dsun.boot.class.path xxx xxx来改变路径也不起任何作用。
原创粉丝点击