24.3 Klassenlader (Class Loader)
 
24.3.1 Wie heißt die Klasse mit der Methode main()?
 
In C(++) ist das erste Element des Felds der main(int argc, char **argv)-Funktion der Name des Programms. Das ist in Java nicht so. Die Methode enthält als ersten Parameter nicht den Namen der Klasse beziehungsweise des Programms, sondern einfach den ersten Parameter, sofern auf der Kommandozeile übergeben. Mit ein bisschen Umweg geht das auch für Klassen.
Der zu einer Klasse gehörende Klassenlader lässt sich mit dem Class-Objekt erfragen. Mit der Methode getResource() bekommen wir von einem Klassennamen ein URL-Objekt zurück, welches dann die Position der Klassendatei im Dateisystem anzeigt. Das folgende Programmbeispiel zeigt, wie wir von einer Klasse den vollständigen Dateipfad zurückbekommen.
Es funktioniert allerdings nur für Klassen, die nicht in einem Jar-Archiv eingebunden sind und nicht aus den Standardbibliotheken kommen. Auch ist eine Dateiangabe unmöglich, wenn wir etwa einen eigenen Klassenlader schreiben, der die Klassen aus einer Datenbank nimmt. Dann gibt es keinen Pfad mehr.
Listing 24.4
FindClassPath.java
import java.net.*;
class FindClassPath
{
static String getClassPath( Class clazz )
{
ClassLoader loader = clazz.getClassLoader();
if ( loader == null )
return null;
URL url = loader.getResource(clazz.getName().replace('.','/')
+ ".class");
return ( url != null ) ? url.toString() : null;
}
public static void main( String args[] ) throws Exception
{
Class c = Class.forName( "FindClassPath" );
System.out.println( "Klasse: " + c.getName() );
System.out.println( "Dateiname: " + getClassPath(c) );
}
}
Benötigen wir den Ort einer Klasse, um mit dieser Information auf weitere Dateien im Verzeichnis zuzugreifen, geht es mit der Class.getResourceAsStream(String) einfacher. Diese Methode dient insbesondere dazu, Ressourcen wie Bilder oder Musik aus einem Jar-Archiv auszulesen. Auch der ClassLoader bietet die Methode getResourceAsStream(String) an. Diese Methoden funktionieren ebenfalls für Klassen aus Jar-Archiven, wenn die Ressource auch im Archiv liegt.
|