2011-12-14 39 views
3

当RMI(Sun VM中的sun.rmi实现)将对象反序列化时,作为远程​​调用参数或返回值的一部分,它需要从类的名称(序列化数据中的字符串)到一个Class对象。 RMI如何决定使用哪个ClassLoader来定义类?Java RMI如何(在实现级别)加载+定义类?

回答

2

默认情况下,Java反序列化为第一个非系统类搜索堆栈并使用其类加载器(即第一个非空类加载器)。 RMI为串行流添加注释以提供应从何处下载类的位置(URL)。默认情况下,RMI类加载器使用该位置来查找其他类。有一个系统属性来关闭这种行为(不是一个坏主意)。

+0

因此,基本上,假设没有指定远程代码库,返回值由ClassLoader加载,ClassLoader会将调用的Class加载到Stub中? (或者定义特定代理类的类加载器,该存根是一个instanceof)在服务器上怎么样?直到UnicastServerRef将实际上调进入导出对象为止,此时参数已全部反序列化,所有堆栈帧都应该是系统类,因为它位于RMI的一个调度线程中。对? – jon 2011-12-14 02:47:13