类加载器(三)

委派模型

上一篇提过Bootstrap Loader所做的初始工作中,除了做一些基本的初始化动作之外,最重要的就是载入定义在sun.misc命名空间底下的Launcher.java之中的ExtClassLoader,并设定其parentnull,然后Bootstrap Loader再载入定义在sun.misc命名空间底下的Launcher.java之中的AppClassLoader,并设定其parent为之前产生的ExtClassLoader实例。这就产生了所谓的类加载器阶层体系,如下图:

 

而之所以有阶层体系的存在,是为了实现委派模型。所谓的委派模型,用简单的话来说,就是类加载器有载入类的需求时,会先请示其parent使用其搜索路径帮忙载入,如果parent找不到,那么才由自己依照自己的搜索路径搜索类。

 

类加载器的功能

除了达到动态性之外,其实最重要的原因莫过于安全。以下图来说明:

 

一,假设我们利用RULClassLoader到网络上的任何地方下载了其它的类,URLClassLoader都不可能下载AppClassLoaderExtClassLoader或者Bootstrap Loader可以找到的同名类(全名),因此,蓄意破坏者根本没有机会植入有问题的程序代码。

二,类加载器无法看到其它相同阶层类加载器所载入的类,如上图所示,图中虚线框起来的部分意指从www.sun.com下载程序代码的类加载器所能看到的类。告诉我们从www.sun.com载入的类,无法看到www.xxx.com载入的类,这除了意味着不同的类加载器可以载入完全相同的类之外,也排除了误用或恶意使用别人程序代码的机会。

posted @ 2012-01-08 23:01  rason2008  阅读(396)  评论(1编辑  收藏  举报