Java Reference
In-Depth Information
public void run()
{
try
{
while(!isInterrupted())
{
System.out.println(getName() + ": " +
c.increment());
sleep(sleepTime);
}
}
catch(InterruptedException e)
{
}
}
}
Wenn wir unsere Komponente installieren wollen, bauen wir eine Jar- oder Zip-Datei, in der
sich die Manifest-Datei sowie die Class-Dateien für CounterClient und CounterThread befi n-
den, und legen sie in das Installationsverzeichnis unseres Frameworks. Wir erleben aber
eine Enttäuschung, denn es wird die folgende Ausnahme geworfen:
ClassNotFoundException: javacomp.prototype.application2.Counter
Die neue Komponente kann also off ensichtlich nicht auf die Counter-Klasse zugreifen. Beim
Übersetzen musste dies allerdings möglich gewesen sein, sonst wäre die Übersetzung
gescheitert. Wenn Sie z. B. Eclipse verwenden und Sie haben beide Anwendungen innerhalb
eines Java-Projekts, dann haben Sie keinerlei Probleme beim Übersetzen. Wenn Sie zwei
unterschiedliche Java-Projekte für die beiden Komponenten in Eclipse angelegt haben, dann
müssen Sie im Projekt der CounterClient-Komponente das CounterService-Projekt in den
Build-Path aufnehmen.
Man könnte nun versuchen, die Class-Datei für die Klasse Counter in die Jar- bzw. Zip-Datei
für die dritte Komponente mit aufzunehmen. Dieser Versuch scheitert aber ebenfalls, denn
nun wird folgende Ausnahme geworfen:
ClassCastException: javacomp.prototype.application2.Counter cannot
be cast to javacomp.prototype.application2.Counter
Was für eine kuriose Ausnahmemeldung! Dass es nicht möglich sein soll, einen Typ X auf
X zu casten, ist eine für den unbedar en Java-Programmierer völlig verwirrende Meldung.
V e rs tändlich wird dies jedoch mit den Erläuterungen zum Klassenladen aus dem ersten Teil
des Buchs: Eine Klasse ist eindeutig durch ihren Namen und das Klassenlader-Objekt, das
sie geladen hat, spezifi ziert. Die Nachricht in der geworfenen Ausnahme will also ausdrü-
cken, dass die Klasse, die mit einem bestimmten Klassenlader-Objekt geladen wurde, nicht
kompatibel ist mit einer Klasse desselben Namens, die aber mit einem anderen Klassen-
lader-Objekt geladen wurde. Unser Komponenten-Framework benutzt für das Laden jeder
Komponente ein neues Klassenlader-Objekt, damit — wie oben für die erste Beispielkompo-
nente beschrieben wurde — Hot Deployment möglich ist. Somit wird also die Klasse Counter
in unserer CounterService-Komponente von einem anderen Klassenlader-Objekt geladen
als die Klasse Counter in unserer CounterClient-Komponente.
 
Search WWH ::




Custom Search