Non esplora ogni riferimento finché non deve
In base alla specifica JVM il caricatore bootstrap è specificato per funzionare come segue:
5.3.1 Loading Using the Bootstrap Class Loader The following steps are
used to load and thereby create the
nonarray class or interface C denoted
by N using the bootstrap class loader.
First, the Java virtual machine
determines whether the bootstrap class
loader has already been recorded as an
initiating loader of a class or
interface denoted by N. If so, this
class or interface is C, and no class
creation is necessary.
Otherwise, the Java virtual machine
performs one of the following two
operations in order to load C:
1: The Java virtual machine searches for a purported
representation of C in a
platform-dependent manner. Note that
there is no guarantee that a purported
representation found is valid or is a
representation of C.
Typically, a class or interface will be represented using a file in a
hierarchical file system. The name of
the class or interface will usually be
encoded in the pathname of the file.
This phase of loading must detect the following error:
- If no purported representation of C is found, loading
throws an instance of
NoClassDefFoundError or an instance of
one of its subclasses.
Then the Java virtual machine attempts to derive a class denoted by
N using the bootstrap class loader
from the purported representation
using the algorithm found in Section
5.3.5. That class is C.
2: The bootstrap class loader can delegate the loading of C to some
user-defined class loader L by passing
N to an invocation of a loadClass
method on L. The result of the
invocation is C. The Java virtual
machine then records that the
bootstrap loader is an initiating
loader of C (§5.3.4).
Notare l'uso della modalità dipendente dalla piattaforma. Ciò significa che quando si cerca una particolare istanza di una classe, la JVM deve esplorare un file system di qualche tipo. Nel caso della tua domanda è un mucchio di JAR.
Mentre cerca nel classpath, la JVM rende il proprio indice interno (probabilmente una mappa efficiente) basato sul nome JAR e sui percorsi che ha incontrato durante il processo di collegamento dinamico. Questo indice cresce man mano che vengono esplorati più JAR per risolvere tutti i riferimenti, ma potrebbe non includere tutti i JAR a meno che non esplorarli causino un ClassNotFoundException
.
Questo processo di caricamento è aiutato dal fatto che la specifica del file JAR fornisce una funzione per /META-INF/INDEX.LIST che funge da indice attendibile delle definizioni di classe all'interno del JAR.
Un interessante effetto collaterale di questo processo è che le definizioni di classi duplicate con lo stesso nome e pacchetto ma le diverse firme di metodo non saranno necessariamente rilevate fino a quando l'esecuzione non avrà luogo ( NoSuchMethodException
ecc.)