精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>网络编程>>RMI>>RMI规范--第五章(6)

主题:RMI规范--第五章(6)
发信人: daystream()
整理人: biubiu(2000-01-02 15:23:26), 站内信件
5.6 RMIClassLoader 类
java.rmi.server.RMIClassLoader 类提供一套公共静态方法,用于支持 RMI
中基于网络的类加载。这些方法由 RMI 的内部编组流调用,用于实现 RMI 参数

和返回值类型的动态类加载。但为了模拟 RMI 的类加载行为,也可由应用程序

直接对其进行调用。RMIClassLoader 类没有可以公共访问的构造函数,因此无

法实例化。

package java.rmi.server;

public class RMIClassLoader {
        public static String getClassAnnotation(Class cl);
        public static Object getSecurityContext(ClassLoader loader);
    public static Class loadClass(String name)
            throws java.net.MalformedURLException,
                            ClassNotFoundException;
        public static Class loadClass(String codebase, String name)
            throws java.net.MalformedURLException,
                           ClassNotFoundException;
        public static Class loadClass(URL codebase, String name)
                throws java.net.MalformedURLException,
                           ClassNotFoundException;
}


getClassAnnotation 方法将返回一个 String,该 String 代表网络
 codebase 路径,远程端点通过此路径下载指定类的定义。RMI 运行时在内部
编组流中将使用由该方法返回的 String 对象作为类描述符的注解。该 
codebase 字符串的格式是由空格界定的 codebase URL 字符串路径。 

返回的 codebase 字符串将依赖于所提供类的类加载器:

如果类加载器是下列之一: 
“系统类加载器”(用于加载应用程序“类路径”中指定的类并从方法
 ClassLoader.getSystemClassLoader 返回的类加载器), 
“系统类加载器”的父类,例如用于已安装方式扩展的类加载器, 
空值(用于加载虚拟机类的“自举类加载器”),<
则返回 java.rmi.server.codebase 属性的值。如果该属性未设置则返回值为
null。
否则,如果类加载器是类 java.net.URLClassLoader 的实例,则返回的
codebase 字符串是一个以空格间隔的外部形式的 URL 列表,它由调用类加载

器上的 getURLs 方法返回。 如果 URLClassLoader 由 RMI 运行时创建用来
服务于一个 RMIClassLoader.loadClass 方法的调用,则无需任何许可就可获
得相关的 codebase 字符串。 如果它是一个任意的 URLClassLoader 实例,
则调用程序必须拥有权限去连接 codebase 路径中所有的 URL,在每个由
getURLs 方法返回的 URL 实例上调用 openConnection().getPermission()
来决定权限。
最后,如果类加载器不是 URLClassLoader 的实例,则 java.rmi.server.codeb
ase
属性值被返回,如果属性值未设置,则返回 null。
因为 getSecurityContext 方法不再适用于 JDK1.2 安全模型,所以不鼓励使
用它;它用于 JDK1.1 内部,用来实现基于类加载器的安全检查。 如果指定的

类加载器是由 RMI 运行时创建用来服务于一个 RMIClassLoader.loadClass
方法的调用,则返回类加载器 codebase 路径中第一个 URL;否则返回 null。



这三种 loadClass 方法都试图通过使用当前线程的上下文类加载器,利用指定

的名称加载类并且在设有安全管理器时为特定 codebase 路径加载内部的
URLClassLoader:

只带一个参数(类 name)的 loadClass 方法隐式使用
java.rmi.server.codebase 属性值作为 codebase 路径。我们不鼓励使用该
版的 loadClass 方法,因为我们已不再鼓励使用 java.rmi.server.codebase

属性。用户应使用下列更通用的版本。
带有 String codebase 参数的 loadClass 方法将它用作 codebase 路径;
codebase 字符串必须是以空格间隔的其形式和 getClassAnnotation 方法返
回的相同 URL 列表。
带有 java.net.URL codebase 参数的 loadClass 方法将单个 URL 用作
codebase。
对于所有 loadClass 方法,codebase 路径将与当前线程的上下文类加载器
(通过在当前线程上调用 getContextClassLoader 来确定)一起使用,以确
定试图用来加载类的内部类加载器实例。RMI 运行时将维持一个内部类加载器
实例表,以父类加载器和加载器的 codebase 路径(一个有序 URL 列表)作为

键值。loadClass 方法以所需的 codebase 路径和当前线程的上下文类加载器
为其父类,在表中查询 URLClassLoader 实例。如果不存在该加载器,就会创
建一个并添加到表中。最后,将在所选类加载器上用指定的类 name 调用
loadClass 方法。

如果设有安全管理器(System.getSecurityManager 不返回 null),则
loadClass 的调用程序必须拥有能连到 codebase 路径中所有 URL 的权限。
否则将抛出异常 ClassNotFoundException。为防止不受信任的代码被加载到
没有安全管理器的 Java 虚拟机中,在未设置安全管理器的情况下,所有
loadClass 方法都应忽略特定的 codebase 路径,而只加载当前线程上下文类
加载器中指定 name 的类。

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.124]

[关闭][返回]