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


Java ist auch eine Insel (2. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Java ist auch eine Insel (2. Auflage)
gp Kapitel 8 Die Funktionsbibliothek
  gp 8.1 Die Java-Klassenphilosophie
  gp 8.2 Wrapper-Klassen
    gp 8.2.1 Die Character-Klasse
    gp 8.2.2 Die Boolean-Klasse
    gp 8.2.3 Die Number-Klasse
    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.4 Kompilieren von Klassen
    gp 8.4.1 Der Sun-Compiler


Galileo Computing

8.4 Kompilieren von Klassen  downtop

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 mit Hilfe 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 JDK 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.4.1 Der Sun-Compiler  toptop

Besteht der Wunsch, aus einem Java-Programm heraus den Compiler zu benutzen, 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 sun.tools.javac.Main in der Jar-Datei lib/tools.jar zu finden – und gegebenenfalls durch einen Disassembler oder Decompiler zu entschlüsseln. Für uns ist es also äquivalent, ob wir nun

$ javac test.java

oder

$ java sun.tools.javac.Main test.java

schreiben. Das Binärprogramm javac fügt nichts Großartiges hinzu, außer 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. Eine Erzeugung der Klasse Main im Paket javac mit den Parametern des Konstruktors sieht folgendermaßen aus:

sun.tools.javac.Main jc = new sun.tools.javac.Main( System.out,"javac" );

if ( !jc.compile(args) )
  // Hilfe, keine .class Datei

Im String args stehen die Argumente der Kommandozeile sowie die des Klassenpfads.

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 sun.tools.javac nicht dem JRE (Java Runtime Environment) beiliegt – nur zum Ausführen, aber nicht zum Entwickeln von Java-Programmen gedacht –, laufen keine Programme, die den Java-Compiler aufrufen. Das gilt für beide Techniken zum Aufruf des Compilers, also der Klasse sun.tools.javac.Main und der Methode Runtime.exec().





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]

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