Re: Dynamic Class downloading

Peter Jones - JavaSoft East <[email protected]>
Newsgroups gmane.comp.java.sun.rmi
Message-ID <20051012224911.GA9284@east>
> Does the dynamic class downloading feature of RMI download any class that's
> not available in the client's class path?
>
> Let's say I have the following code on the client:
>
> Object o = context.lookup("jndiName");
> ExampleHome h = (ExampleHome)o;
>
> (I know that I have to use PortableRemote.. class to typecast, but it's just
> for brevity's sake that I simply typcasted it)

[Note that using PortableRemoteObject.narrow, instead of a normal cast
expression, is only necessary when (possibly) using RMI-IIOP stubs.]

> Now, is it mandatory that I have this the ExampleHome's class file in the
> classpath for this client program to run? Or does it get dynamically
> downloaded from the server (you can assume that it's already present on the
> server, which exposes it using the codebase url).

The simple answer to the first question is Yes, you must have
ExampleHome in the client's class path.  More precisely, ExampleHome
must be loadable by the same class loader that defined the class
containing the above code snippet, because that class's definition
will have a symbolic reference to ExampleHome, which (by the Java VM
specification) must be resolved by that class's defining class loader.
The class loader used to download classes from another remote codebase
doesn't come into play.

This topic (can types directly referenced by client code be
downloaded?) has come up several times on this list; see the following
posts/threads for further disucssion:

http://archives.java.sun.com/cgi-bin/wa?A2=ind9909&L=rmi-users&P=16343
http://archives.java.sun.com/cgi-bin/wa?A2=ind0107&L=rmi-users&P=14759
http://archives.java.sun.com/cgi-bin/wa?A2=ind0107&L=rmi-users&P=17803
http://archives.java.sun.com/cgi-bin/wa?A2=ind0110&L=rmi-users&P=14664
http://archives.java.sun.com/cgi-bin/wa?A2=ind0112&L=rmi-users&P=5706
http://archives.java.sun.com/cgi-bin/wa?A2=ind0305&L=rmi-users&P=2858

> If this class has to be present in the client's classpath, then what exactly
> does the dynamic class downloading do?

It can be used to download the actual classes of objects unmarshalled
as part of arguments and return values, which may be implementations
or subclasses of the types directly used by the receiving code.  The
most basic example is remote stub classes (which client applications
should not reference directly).  There is more information in this
tutorial:
        http://java.sun.com/j2se/1.5.0/docs/guide/rmi/codebase.html

In this tutorial, the client also provides classes to be downloaded by
the server, a generic "compute server" that can execute tasks whose code
it was not deployed with:
        http://java.sun.com/docs/books/tutorial/rmi/index.html

Presentation #2 on this page, by John McClain, explores the benefits
of dynamically loading "smart" proxy classes (i.e. not just simple
remote stub classes) for remote services:
        http://www.jini.org/webinar/

-- Peter

===========================================================================
To unsubscribe, send email to [email protected] and include in the body
of the message "signoff RMI-USERS".  For general help, send email to
[email protected] and include in the body of the message "help".

For a list of frequently asked RMI questions please refer to:
http://java.sun.com/j2se/1.3/docs/guide/rmi/faq.html

To view past RMI-USERS postings, please see:
http://archives.java.sun.com/archives/rmi-users.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.