|CONTENTS | PREV | NEXT||Java Remote Method Invocation|
When parameters and return values for a remote method invocation are unmarshalled to become live objects in the receiving JVM, class definitions are required for all of the types of objects in the stream. The unmarshalling process first attempts to resolve classes by name in its local class loading context (the context class loader of the current thread). RMI also provides a facility for dynamically loading the class definitions for the actual types of objects passed as parameters and return values for remote method invocations from network locations specified by the transmitting endpoint. This includes the dynamic downloading of remote stub classes corresponding to particular remote object implementation classes (and used to contain remote references) as well as any other type that is passed by value in RMI calls, such as the subclass of a declared parameter type, that is not already available in the class loading context of the unmarshalling side.
To support dynamic class loading,
the RMI runtime uses special subclasses of
java.io.ObjectInputStream for the marshal streams that
it uses for marshalling and unmarshalling RMI parameters and return
values. These subclasses respectively override the
annotateClass method of
ObjectOutputStream and the
ObjectInputStream to communicate information
about where to locate class files containing the definitions for
classes corresponding to the class descriptors in the stream.
For every class descriptor written
to an RMI marshal stream, the
adds to the stream the result of calling
the class object, which may be
null or may be a
String object representing the codebase URL path (a
space-separated list of URLs) from which the remote endpoint should
download the class definition file for the given class.
For every class descriptor read from
an RMI marshal stream, the
resolveClass method reads a
single object from the stream. If the object is a String (and the
value of the
the result of calling
String object as the first parameter and
the name of the desired class in the class descriptor as the second
resolveClass returns the result
RMIClassLoader.loadClass with the name of
the desired class as the only parameter.
See the section "The RMIClassLoader Class" for more details about class loading in RMI.