| 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.ObjectOutputStream and
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 resolveClass
method of 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
annotateClass method adds to the stream the result of
calling
java.rmi.server.RMIClassLoader.getClassAnnotation for
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
java.rmi.server.useCodebaseOnly property is not
true), then resolveClass returns the
result of calling RMIClassLoader.loadClass with the
annotated String object as the first parameter and the
name of the desired class in the class descriptor as the second
parameter. Otherwise, resolveClass returns the result
of calling 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.