Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (3. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Buch: Java ist auch eine Insel
gp Kapitel 8 Die Funktionsbibliothek
  gp 8.1 Die Java-Klassenphilosophie
    gp 8.1.1 Übersicht über die Pakete der Standardbibliothek
  gp 8.2 Wrapper-Klassen
    gp 8.2.1 Die Character-Klasse
    gp 8.2.2 Die Boolean-Klasse
    gp 8.2.3 Die Basisklasse Number für numerische Wrapper-Objekte
    gp 8.2.4 Die Klasse Integer
    gp 8.2.5 Behandlung von Überlauf
    gp 8.2.6 Unterschiedliche Ausgabeformate
    gp 8.2.7 Boxing und Unboxing
  gp 8.3 Ausführung von externen Programmen
    gp 8.3.1 DOS-Programme aufrufen
    gp 8.3.2 Die Windows-Registry verwenden
    gp 8.3.3 Einen HTML-Browser unter Windows aufrufen
  gp 8.4 Klassenlader (Class Loader)
    gp 8.4.1 Wie heißt die Klasse mit der Methode main()?
    gp 8.4.2 Zeitmessung und Profiling
  gp 8.5 Compilieren von Klassen
    gp 8.5.1 Der Sun-Compiler


Galileo Computing

8.4 Klassenlader (Class Loader) downtop


Galileo Computing

8.4.1 Wie heißt die Klasse mit der Methode main()? downtop

In C(++) ist das erste Element des Felds der Funktion main(int argc, char **argv) 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 8.3 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.


Galileo Computing

8.4.2 Zeitmessung und Profilingtoptop

Die Methode System.currentTimeMillis() gibt die vergangenen Millisekunden seit dem 1.1.1970 zurück. Die Differenz zweier Zeitwerte kann zur groben Abschätzung von Ausführungszeiten für Programme dienen.

Listing 8.4 Profiling.java

class Profiling
{
  public static void main( String args[] )
  {
    int MAX = 10000;
    
    // use static function
    
    long time1 = System.currentTimeMillis();
    
    String s = "";
    for ( int i = MAX; i-- > 0; )
      s = s.concat( "Heini" );
    
    time1 = System.currentTimeMillis() - time1;
    
    // use dynamic function
    
    long time2 = System.currentTimeMillis();
    
    String t = "";
    for ( int i = MAX; i-- > 0; )
      t += "Heini";
    
    time2 = System.currentTimeMillis() - time2;
    
    System.out.println( "s.concat:  " + time1 + " ms" );
    System.out.println( "t+=:       " + time2 + " ms" );
  }
}

Wird das Programm gestartet, so bekomme ich auf meinem Rechner (AMD Athlon 1,9+, Java 2 SDK 1.4.1) die nachstehende Ausgabe:

s.concat:  3265 ms
t+=:       3845 ms 




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing] [Buchkatalog] [Neue Bücher] [Vorschau]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de