`
chillwarmoon
  • 浏览: 153672 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

class loader的体系结构

    博客分类:
  • JVM
阅读更多

没有看过bill venners的《深入Java虚拟机》,但是看了他写的四部曲中的security and the class loader architecture,感觉受益颇深,建议大家有时间可以去看看原文,本文将对其中的class loader architecture的内容总结一下。

在介绍本文之前,先说一下什么是sandbox,翻译过来就是“沙箱”,在计算机安全中,sandbox指的是一个虚拟的容器,不被信任的程序可以在该容器中安全执行;在软件开发中,sandbox指的是一个在线的环境,该环境在不影响原来系统的前提下,能够测试代码和内容的变化。大家可以参考http://en.wikipedia.org上面关于sandbox的解释,不过该网站被gcd封掉了,可以用代理上。在看英文文章的时候,不明白的术语可以到上边查,挺不错的网站。

相对于sandbox的第一种解释,java的security model能够保护end-user使其不受到untrusted source的侵入。为了达到这个目的java程序提供了一个自定义的sandbox,而java程序运行在这个sandbox之内。java程序在sandbox之内可以做任何事情,但是不能在sandbox边界之外运行任何东西。

class loader体系结构

class loader体系结构在security sandbox中起到重要的作用。在一个虚拟机中可以存在多个的class loader,一个java应用可以用两种类型的class loader。一种是primordial class loader,另外一种是class loader object。primordial class loader是JVM实现的一部分。例如:一个JVM在OS之上利用C来实现,则该primordial class loader是C程序的一部分。primordial class loader用于装载trusted classes,包括Java API的class,通常是从本地硬盘中装载这些class。

JVM认为通过primordial class loader装载的类都是trusted class,而不管这些class是否是Java API的class;而对于从class loader object装载进来的类则需要判断是否安全,默认的是把由class loader object装载进来的class看作是untrusted class。class loader objects是用java编写的,被编译成class文件,然后被虚拟机所装载,最后像初始化其他object一样来进行初始化class loader object。可以利用class loader object在应用运行时刻装载class。

class loader object和primordial class loader的关系参见下图:

 

class loader和name-spaces

在JVM利用这两种class loader装载class的时候,如果被class loader装载的class A引用了其他的class B,则装载class A的class loader也会装载该class B。name-spaces就是一个被某个class loader所加载的类的名字的集合,对于每个class loader,JVM都维持一个与其对应的name-space,在同一个name-space下的类的名字是不能相同的。而可以建立多个class loader来加载同名的class,结果是一个JVM有多个class loader,而在每个class loader对应的name-spaces下有相同的class存在。如果程序不做出显示规定,那么在不同的name-space下的class是不能相互访问的。因此通过name-space可以在由不同的class loader加载的classes之间建立shield,因此说class loader在security sandbox中起到重要作用。

class loader之间的交互

通常情况下,一个class loader object要和其他的class loader交互,至少要和primordial class loader交互。例如:一个java应用利用class loader object加载网络上的class,实现起来可以通过先让该class loader object调用primordial class loader,在trusted classes库(通常是本地的Java API和本地classes)中查找是否存在该class,如果不存在,则会以自定义的方式来加载远程的class。然后在访问这个加载后的远程class时,该class可能存在对一个String类的引用,因此按照该class loader object加载该远程class的方式加载该String类,首先是调用primordial class loader,此时在本地的Java API中找到了该类,则在本地中加载该String类。可能在primordial class loader在加载String类之前,String类已经被加载进来了,则primordial class loader所做的就是返回以前加载的String类。

没想到写这东西这么花时间,在security and the class loader architecture中还介绍了建立security environment及其相关内容,本文将不再提到,大家有时间可以自己去看看,转述的总不如原文深刻。下面给出了一些相关链接:

java's security architecture
http://www.javaworld.com/javaworld/jw-08-1997/jw-08-hood.html

security and the class verifier
http://www.javaworld.com/javaworld/jw-10-1997/jw-10-hood.html

java security:how to install the security manager and customize your security policy
http://www.javaworld.com/javaworld/jw-11-1997/jw-11-hood.html

security and the class loader architecture
http://www.javaworld.com/javaworld/jw-09-1997/jw-09-hood.html

 

分享到:
评论
1 楼 kedou 2007-06-12  
受益不浅

相关推荐

Global site tag (gtag.js) - Google Analytics