Java Reference
In-Depth Information
Anhand des Programms aus Listing 5.1 soll ein weiterer, Ihnen vermutlich ebenfalls
bekannter Eff ekt beschrieben werden. Dazu gehen wir diese Mal vom Normalfall aus, dass
nämlich alle benötigten Class-Dateien vorhanden sind. Nehmen wir nun an, dass die Zufalls-
zahl kleiner als 0,5 ist und der Anweisungsblock mit der For-Schleife ausgeführt wird. Dies
dauert ca. 30 Sekunden, da das Programm bei jedem Schleifendurchlauf eine Zeile ausgibt
und dann eine Sekunde pausiert. Wenn Sie nun in diesen 30 Sekunden die Methode call in
der Klasse SomeClass verä ndern (z. B. die Ausgabe von „hallo“ in „huhu“ ändern), anschlie-
ßend neu übersetzen und dadurch die Datei SomeClass.class durch eine andere Version
ersetzt wird, werden Sie keinen Eff ekt beim laufenden Programm wahrnehmen, denn die
Klasse SomeClass wird natürlich nicht für jeden Schleifendurchlauf neu geladen, sondern
eben nur einmal bei der ersten Benutzung. Es ist allerdings doch möglich, ein und dieselbe
Klasse während der Ausführung eines Programms mehrfach— auch in mehreren Versio-
nen — zu laden. Dazu benötigt man aber unterschiedliche ClassLoader-Objekte. Wir küm-
mern uns im nächsten Abschnitt deshalb um ClassLoader.
5 . 2 ClassLoader
Bei der Ausführung eines Java-Programms gibt es in der Regel mehrere ClassLoader-
Objekte. Ein ClassLoader-Objekt kann eine Klasse nur einmal laden. Man kann aber weitere
ClassLoader-Objekte erzeugen, die eine bestimmte Klasse jeweils einmal laden. Insgesamt
kann diese Klasse dadurch mehrfach geladen werden.
Die Basis des Klassenladens ist die abstrakte Klasse ClassLoader im Package java.lang. Die
entscheidende Methode ist loadClass:
public Class<?> loadClass(String name) throws ClassNotFoundException
Der String-Parameter muss dabei ein vollständig spezifi zierter Klassenname (also ein-
schließlich des Package-Namens) sein.
Aus der abstrakten ClassLoader-Klasse sind mehrere Klassen abgeleitet worden (Secure-
ClassLoader, URLClassLoader). Es ist auch möglich, eine eigene ClassLoader-Klasse zu
schreiben. Von dieser Möglichkeit wird aber in diesem Buch kein Gebrauch gemacht. Alle
ClassLoader-Objekte (gleich von welcher ClassLoader-Klasse sie sind) sind baumartig ver-
netzt. Die Standard-ClassLoader-Klassen verhalten sich so, wenn ein ClassLoader-Objekt
aufgefordert wird, eine Klasse zu laden:
! Zunächst wird geprü , ob diese Klasse bereits vorher von diesem ClassLoader-Objekt
geladen wurde.
! Falls ja, erfolgt keine weitere Aktion.
! Falls nein, wird die Anfrage an den Vorgänger-ClassLoader im Baum weitergeleitet.
! Der Vorgänger-ClassLoader handelt auch so. Das heißt, wenn dieser ClassLoader die
Klasse schon geladen hat, ist der komplette Ladevorgang beendet. Andernfalls wird die
Anfrage an den Vorgänger weitergereicht, sofern es einen Vorgänger gibt (sofern also die
Wurzel noch nicht erreicht wurde). Die Auff orderung wird also bis zur Wurzel weiterge-
reicht. Der Wurzel-Loader bekommt somit als Erster die Chance zum Laden der Klasse.
 
Search WWH ::




Custom Search