Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
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 Woher die kleinen Klassen kommen
gp 8.4.2 Drei Typen von Klassenladern
gp 8.4.3 Der java.lang.ClassLoader
gp 8.4.4 Hot Deployment mit dem URL-ClassLoader
gp 8.4.5 Das jre/lib/endorsed-Verzeichnis
gp 8.4.6 Wie heißt die Klasse mit der Methode main()?
gp 8.5 Zeitmessung und Profiling
gp 8.6 Compilieren von Klassen
gp 8.6.1 Der Sun-Compiler


Galileo Computing

8.6 Compilieren von Klassendowntop

Die Klassenbibliothek von Java bietet zwei unterschiedliche Techniken zum Übersetzen von Klassendateien. Die eine Methode steuert die Übersetzung einer geladenen Klasse von der Repräsentation in der JVM in eine die Geschwindigkeit steigernde Darstellung mithilfe eines Just-In-Time-(JIT) Compilers. Die andere Technik basiert auf der Idee, den Original-Compiler von Sun zu nutzen, dessen Schnittstelle ebenfalls in Java programmiert ist und als Klasse dem Java2 SDK (nicht der JRE - Java Runtime Environment) beiliegt. Auf diese Weise kann ein laufendes Programm einen (selbst erzeugten) Java-Quelltext übersetzen und die darin definierten Klassen anschließend sofort benutzen.


Galileo Computing

8.6.1 Der Sun-Compilertoptop

Besteht der Wunsch, aus einem Java-Programm heraus den Java-Compiler aufzurufen, so ist die eine Möglichkeit der Einsatz der Methode System.exec(). Doch es gibt auch einen anderen Weg. Er nutzt aus, dass auch der Sun-Compiler in Java programmiert ist. Er nutzt jedoch nicht die compileClasses()-Methoden der Klasse Compiler, da er direkt aus dem Quelltext des Programms Bytecode erstellt. Der Compiler liegt dem JDK nicht als Quellcode bei, jedoch ist die Klasse com.sun.tools.javac.Main in der Jar-Datei lib/tools.jar zu finden - und gegebenenfalls durch einen Disassembler oder Decompiler zu entschlüsseln. Das Binärprogramm javac fügt nichts Großartiges hinzu, abgesehen davon vielleicht, dass es noch die Heap-Größe setzt. Ein Aufruf des javac-Kommandos in exec() muss prinzipbedingt länger dauern als ein direkter Aufruf der main()-Methode des Compilers. Beim javac-Kommando muss das Betriebssystem einen neuen Prozess erzeugen. Eine zweite JVM wird geladen, die wieder alle dreihundert benötigten Standardklassen lädt und vom JIT-Compiler übersetzen lässt.

Den Sun-Compiler im eigenen Programm benutzen

Nicht nur die main()-Methode ist öffentlich, auch innerhalb eines eigenen Java-Programms können wir den Compiler gezielt benutzen. Dies geschieht mit dem Aufruf der Funktion compiler() aus der Klasse Main:

public static int compileJava( String javaFile )
{
  String[] args = {
    "-d",
    "c:/",
    "-classpath",
    System.getProperty("java.class.path"),
    javaFile };
   return Main.compile( args );
}

Die API ist nicht öffentlich, und bei dem Einsatz der Methode ist Vorsicht geboten, denn sie braucht in zukünftigen Versionen des JDK nicht mehr zu existieren. Da das Paket com.sun.tools.javac nicht dem JRE beiliegt - nur zum Ausführen, aber nicht zum Entwickeln von Java-Programmen gedacht -, laufen keine Programme, die den Java-Compiler aufrufen.


Beispiel Die Trickserei muss nicht mehr nötig sein, wenn die JSR 191 mit dem Paket javax.compiler die Java Compiler API implementiert. Die Klassen rund um das Paket werden den Compiler aufrufen und die Fehlerwerte komfortabel auslesen können.





Copyright (c) Galileo Press GmbH 2004
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]

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