Java Reference
In-Depth Information
}
public class DynamicClassLoading
{
public static void main(String[] args)
{
if(Math.random() <= 0.5)
{
for(int i = 1; i <= 30; i++)
{
SomeClass some = new SomeClass();
some.call();
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
}
}
}
Wenn die Datei DynamicClassLoading.java übersetzt wird, werden zwei Dateien erzeugt, für
jede Klasse eine, nämlich DynamicClassLoading.class und SomeClass.class. Was passiert,
wenn die Datei SomeClass.class gelöscht wird und dann das Programm mit dem Kommando
java javacomp.basics.DynamicClassLoading
gestartet wird? Wird in jedem Fall die Ausnahme ClassNotFoundException geworfen? Oder
passiert das bei häufi ger Ausführung nur in ca. 50 % der Fälle?
Wie Sie vielleicht schon vermuten, ist die zweite Antwortmöglichkeit die Richtige. In Java
werden nicht alle für die Programmausführung potentiell benötigten Klassen zu Beginn
geladen, sondern eine Klasse wird immer erst dann geladen, wenn sie zum ersten Mal
gebraucht wird (man bezeichnet dieses Verhalten auch als Lazy Class Loading). Wenn also
mit Math.random() eine Zufallszahl zwischen 0 und 1 bestimmt wird und wenn die Zahl
größer als 0,5 ist (was in 50 % der Programmausführungen der Fall sein dür e, da man von
einer Gleichverteilung ausgehen kann), dann wird die Klasse SomeClass nicht benötigt, da
der Anweisungsblock hinter dem if nicht ausgeführt wird. Das Fehlen der Klasse SomeClass
fällt in diesen Fällen nicht auf; das Programm läu somit ohne das Werfen einer Ausnahme
zu Ende. Bei Interesse kann man sich übrigens anzeigen lassen, wann welche Klasse gela-
den wird. Dazu startet man das Programm mit der Option „-verbose“ (zeigt auch z. B. Aktio-
nen des „Abfallsammelns“ [Garbage Collection]) oder „-verbose:class“ (zeigt nur das Laden
von Klassen an):
java -verbose:class javacomp.basics.DynamicClassLoading
Ich empfehle Ihnen, das einmal auszuprobieren. Sie werden vielleicht überrascht sein, wie
viele Meldungen Sie sehen werden. Bei der Ausführung des Programms aus Listing 5.1, das
aus nur zwei Klassen besteht, werden mehr als 300 Klassen geladen.
 
Search WWH ::




Custom Search