Provides class loader and {@link java.rmi.server.RMIClassLoader}
provider implementations that support preferred classes.
A preferred class is a class that is to be loaded by a class loader
without the loader delegating to its parent class loader first.
Resources may also be preferred.
With a class loader that supports preferred classes, the first JAR
file or other URL location from which the loader loads classes can
contain a preferred list. A preferred list declares names of
certain classes and other resources throughout the loader's path of
URLs as being preferred or not. When the loader is asked to
load a class or resource that is preferred (according to the preferred
list) and the class or resource exists in the loader's path of URLs,
the loader will not delegate first to its parent class loader as it
otherwise would do; instead, it will attempt to load the class or
resource from its own path of URLs only.
By controlling class loader delegation, preferred classes can help
accomplish the following goals:
- Ensure that a downloaded class preserves its original codebase
annotation when it is marshalled later, even if there is a local
version of the class (that is, a class with the same name that could
be loaded by an ancestor class loader).
- Ensure that the desired version of a downloaded class or resource
is used, even if there is a local version of the class or resource.
- Ensure that the expected security permissions are granted to a
downloaded class, such as the automatic permission to connect to its
codebase host, even if there is a local version of the class.
Preferred classes accomplish these goals at the expense of type
equivalence with local classes, because a preferred class constitutes
a different runtime type than a local class with the same name that
might otherwise have been loaded. Therefore, the choice of which
classes to make preferred should be considered carefully.
There is not a complete or definitive set of rules for when to make
a class or resource preferred or not, but the following guidelines are
generally advisable:
- A type that appears in the transitive closure of the public APIs
of a downloaded component should not be preferred, so that code
defined by other class loaders can use those APIs. In other words,
for any public class or interface that is part of the downloaded
component's exported API, that class or interface as well as the
declared types of its public fields and the declared parameter and
return types of its public methods should not be preferred, and the
same algorithm should be applied recursively to all such declared
types. Exception types thrown by the methods of the component's API
that are expected to be caught explicitly by external callers should
also not be preferred.
- A class that will be the actual class of a serialized object (and
that is not covered by the previous guideline) should be preferred, so
that its original codebase annotation will be preserved for later
marshalling, and so forth.
{@link net.jini.loader.pref.PreferredClassLoader} is a class loader
implementation that supports preferred classes, and its specification
defines the format of preferred lists.
{@link net.jini.loader.pref.PreferredClassProvider} is an
RMIClassLoader
provider implementation that uses
PreferredClassLoader
to support preferred classes.
{@link net.jini.loader.pref.RequireDlPermProvider} is a subclass of
PreferredClassProvider
that enforces {@link
net.jini.loader.DownloadPermission}.
@since 2.0
@version 2.0