当类装载器将类型装入Java虚拟机时,它们将为每个类型指派一个保护域。保护域定义了授 予一段特定代码的所有权限。(一个保护域对应策略文件中的一个或多个grant子句。)装载入Java虚拟机的每一个类型都属于一个且仅属于—个保护域。
类装载器知道它装载的所有类或接口的代码库和签名者。它利用这些信息来创建一个 CodeSource对象。它将这个CodeSource对象传递给当前Policy对象的getpermissions ()方法, 得到这个抽象类java.security.PermissionCollection的子类实例。这个PermissionCollection包含了到所有Permission对象的引用(这些Permission对象由当前策略授予指定代码来源)。利用它创建 的CodeSource和它从Policy对象得到的PermissionCollection,它可以实例化一个新的 ProtectDomain对象。它通过将合适的ProtectionDomain对象传递给defineClass ()方法,来将这 段代码放到一个保护域中。defineClass ()方法是类ClassLoader的一个实例方法,用户自定义 类装载器调用它来将类型导入到java虚拟机中。将类型指派到保护域中是一个重要的工作,就像在本章前面提到的一样,它是类装载器体系结构支持Java沙箱安全模型的三个方法中的一个。
虽然这个Policy对象代表了一个从代码来源到权限的全局映射,但是最终还是由类装载器负责决定代码执行时将获得什么样的权限。例如,一个类装载器可以完全忽略当前的策略,而随机地赋予权限。或者,一个类装载器可以向由Policy对象的getPermissions ()方法返回的权限 中再添加一些权限。例如,如果一个类型装载器要装载一个applet代码,除了由当前策略可能授予这段代码的权限以外,它还可以添加一个权限,使得它可以建立一个到这个applet的源主机的 socket连接。现在读者可以明白了,类装载器在装载类时起到了重要的安全作用。