没有看过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
分享到:
相关推荐
java 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loader
Java Class Loader总结
自己收集的java class loader相关的一些网络资源文档, 希望对大家有所帮助
软件体系结构研究是目前软件工程领域研究的新一轮热潮,是对软件的更高层次...最后,以软件界面体系结构为指导,分析了MFC(Microsoft Fundament Class)的文档视图结构,并给出了软件界面体系结构的具体设计和实现。
深入 Java 的Class Loader(类加载器)
class-loader测试工程
Java虚拟机中的class类文件的知识,个人整理大的class类文件结构.xmind,有什么问题及时反馈。
class文件结构浅析class文件结构浅析class文件结构浅析class文件结构浅析class文件结构浅析
Dynamic class loading in the Java Virtual Machine
class_loader_utility.cc
class文件结构组成.doc
应用服务器类加载器 共享库 类加载器问题诊断 资源及参考资料
轻量级C ++对象动态发现和加载机制。 使您可以轻松地将插件功能添加到C ++程序。 支持使用XML文件将实现类动态映射到DLL。
一个计算机的class的层次结构 是一个C++入门级的程序设计 大家是一个很好的程序 初学者可以学学
class文件结构参照表全集.pdf
我这里是两张Class类文件结构的图,分别是png格式的图片和xmind的思维导图。
上海计算所分析的关于java字节码的结构组成
NULL 博文链接:https://sbiigu.iteye.com/blog/323180
JavaClassViewer-2.0.4, 用于理解Class文件结构。 解析出class结构,以及十六进制的表示,特别方便。 原下载地址: http://www.softpedia.com/get/Programming/File-Editors/Java-Class-Viewer.shtml。另外也可以参考...
第一章:class文件结构.mmap