Was wir brauchen, sind ein paar verrückte Leute; seht euch an, wohin uns die Normalen gebracht haben. – George Bernard Shaw (1856–1950)
10 Die Klassenbibliothek
10.1 Die Java-Klassenphilosophie 

Eine Programmiersprache besteht nicht nur aus einer Grammatik, sondern, wie im Fall von Java, auch aus einer Programmierbibliothek. Eine plattformunabhängige Sprache – so wie sich viele C oder C++ vorstellen – ist nicht wirklich plattformunabhängig, wenn auf jedem Rechner andere Funktionen und Programmiermodelle eingesetzt werden. Genau dies ist der Schwachpunkt von C(++). Die Algorithmen, die kaum vom Betriebssystem abhängig sind, lassen sich überall gleich anwenden, doch spätestens bei grafischen Oberflächen ist Schluss. Dieses Problem ergibt sich in Java seltener, weil sich die Entwickler große Mühe gaben, alle wichtigen Funktionen in wohlgeformten Paketen unterzubringen. Diese decken insbesondere die zentralen Bereiche Datenstrukturen, Ein- und Ausgabe, Grafik- und Netzwerkprogrammierung ab.
10.1.1 Übersicht über die Pakete der Standardbibliothek 

Es folgt eine Übersicht über die mehr als 200 Pakete, die Java in der Version 6 deklariert. Sie beschreiben zusammen 3.777 Typen, davon 2.457 Klassen, 972 Schnittstellen, 49 Aufzählungen, 473 Ausnahmeklassen und 32 Errorklassen. Insgesamt gibt es 1.482 Objektvariablen, 4.408 statische Variablen/Konstanten, 21.881 Objektmethoden in Klassen und 5.226 aus Schnittstellen, 3.039 Klassenmethoden sowie 4.973 Konstruktoren. (In Java 1.0 verteilten sich 212 Klassen auf 8 Pakete.) Die wichtigen Pakete sind fett hervorgehoben.
java.applet |
Stellt Klassen für Java-Applets bereit, damit diese auf Web-seiten ihr Leben führen können. |
java.awt |
Das Paket AWT (Abstract Windowing Toolkit) bietet Klassen zur Grafikausgabe und zur Nutzung von grafischen Bedienoberflächen. |
java.awt.color |
Unterstützung von Farbräumen und Farbmodellen. |
java.awt.datatransfer |
Informationsaustausch zwischen (Java-)Programmen über die Zwischenablage des Betriebssystems. |
java.awt.dnd |
Drag&Drop, um unter grafischen Oberflächen Informationen zu übertragen oder zu manipulieren. |
java.awt.event |
Schnittstellen für die verschiedenen Ereignisse unter grafischen Oberflächen. |
java.awt.font |
Klassen, damit Zeichensätze genutzt und modifiziert werden können. |
java.awt.geom |
Paket für die Java 2D-API, um ähnlich wie im Grafikmodell von PostScript beziehungsweise PDF affine Transformationen auf beliebige 2D-Objekte anwenden zu können. |
java.awt.im |
Klassen für alternative Eingabegeräte. |
java.awt.image |
Erstellen und Manipulieren von Rastergrafiken. |
java.awt.image.renderable |
Klassen und Schnittstellen zum allgemeinen Erstellen von Grafiken. |
java.awt.print |
Bietet Zugriff auf Drucker und kann Druckaufträge erzeugen. |
java.beans |
JavaBeans definieren wiederverwendbare Komponenten auf der Client-Seite, die beim Programmieren visuell konfiguriert werden können. |
java.beans.beancontext |
Beans lassen sich in einem Bean-Kontext zusammenbringen. |
java.io |
Möglichkeiten zur Ein- und Ausgabe. Dateien werden als Objekte repräsentiert. Datenströme erlauben den sequenziellen Zugriff auf die Dateiinhalte. |
java.lang |
Ein Paket, das automatisch eingebunden ist und unverzichtbare Klassen wie String-, Thread- oder Wrapper-Klassen enthält. |
java.lang.annotation |
Unterstützung für die in Java 5 hinzugekommenen Annotationen. |
java.lang.instrument |
Klassen können instrumentalisiert werden. |
java.lang.management |
Überwachung der virtuellen Maschine. |
java.lang.ref |
Behandelt Referenzen. |
java.lang.reflect |
Mit Reflection ist es möglich, Klassen und Objekte über sich erzählen zu lassen. |
java.math |
Beliebig lange Ganzzahlen oder Fließkommazahlen. |
java.net |
Kommunikation über Netzwerke. Klassen zum Aufbau von Client- und Serversystemen, die sich über TCP beziehungsweise IP mit dem Internet verbinden lassen. |
java.nio |
Neue IO-Implementierung (daher NIO [NIO steht ja für New IO. Eine Aktualisierung ist NIO2.]) für performante Ein- und Ausgabe. |
java.nio.channels |
Datenkanäle für nicht blockierende Ein- und Ausgabe- operationen. |
java.nio.charset |
Kodierungen für die Übersetzung zwischen Byte und Unicode-Zeichen. |
java.rmi |
Aufruf von Methoden auf entfernten Rechnern. |
java.rmi.activation |
Unterstützung für die RMI-Aktivierung, wenn Objekte auf ihren Aufruf warten. |
java.rmi.dgc |
Der verteilte Garbage Collector DGC (Distributed Garbage Collection). |
java.rmi.registry |
Zugriff auf den Namensdienst unter RMI, die Registry. |
java.rmi.server |
Die Serverseite von RMI. |
java.security |
Klassen und Schnittstellen für Sicherheit. |
java.security.acl |
Unwichtig, da sie durch Klassen in java.security ersetzt wurden. |
java.security.cert |
Analysieren und Verwalten von Zertifikaten, Pfaden und Rückruf (Verfall) von Zertifikaten. |
java.security.interfaces |
Schnittstellen für RSA- und DSA-Schlüssel. |
java.security.spec |
Parameter der Schlüssel und Algorithmen für die Verschlüsselung. |
java.sql |
Zugriff auf relationale Datenbanken über SQL. |
java.text |
Unterstützung für internationalisierte Programme. Behandlung von Text, Formatierung von Datumswerten und Zahlen. |
java.util |
Datenstrukturen, Raum und Zeit sowie Teile der Internationalisierung, Zufallszahlen. |
java.util.concurrent |
Hilfsklassen für nebenläufiges Programmieren, etwa Thread-Pools. |
java.util.concurrent.atomic |
Atomare Operationen auf Variablen. |
java.util.concurrent.locks |
Lock-Objekte. |
java.util.jar |
Möglichkeiten, um auf das eigene Archiv-Format JAR (Java Archive) zuzugreifen. |
java.util.logging |
Protokollieren von Daten und Programmabläufen. |
java.util.prefs |
Benutzer- und Systemeigenschaften werden über Konfigurationsdateien verwaltet. |
java.util.regex |
Unterstützung von regulären Ausdrücken. |
java.util.zip |
Zugriff auf komprimierte Daten mit GZIP und Archive (ZIP). |
javax.accessibility |
Schnittstellen zwischen Eingabegeräten und Benutzerkomponenten. |
javax.activation |
JavaBeans Activation Framework. Findet unter anderem MIME-Typen. |
javax.activity |
Drei Ausnahmen im Fall von CORBA-Fehlern. |
javax.annotation |
Zentrale Annotationen, etwa für Injizierung oder Lebenszyklus. |
javax.annotation.processing |
Schnittstellen für Annotation Processors. |
javax.crypto |
Klassen und Schnittstellen für kryptografische Operationen. |
javax.crypto.interfaces |
Schnittstellen für Diffie-Hellman-Schlüssel. |
javax.crypto.spec |
Klassen und Schnittstellen für Schlüssel und Parameter zur Verschlüsselung. |
javax.imageio |
Schnittstellen zum Lesen und Schreiben von Bilddateien in verschiedenen Formaten. |
javax.imageio.event |
Ereignisse, die während des Ladens und Speicherns bei Grafiken auftauchen. |
javax.imageio.metadata |
Unterstützung für beschreibende Metadaten in Bilddateien. |
javax.imageio.plugins.bmp |
Klassen, die das Lesen und Schreiben von BMP-Bilddateien unterstützen. |
javax.imageio.plugins.jpeg |
Klassen, die das Lesen und Schreiben von JPEG-Bilddateien unterstützen. |
javax.imageio.stream |
Unterstützt das Einlesen und Schreiben von Bildern durch die Behandlung der unteren Ebenen. |
javax.jws |
Annotationen für Web-Services. |
javax.jws.soap |
Nur Annotation und Aufzählungen für SOAP-Binding. |
javax.lang.model |
Eine Aufzählung für Java-Versionen. |
javax.lang.model.element |
Repräsentiert Elemente der Java-Sprache (Methode, Annotation ...). |
javax.lang.model.type |
Repräsentiert Java-Typen (Fehlertyp, Referenztyp, ...). |
javax.lang.model.util |
Utility-Klassen für Programmelemente und Typen. |
javax.management |
Management-API (JMX) mit einigen Unterpaketen. |
javax.management.loading |
Unterstützt dynamisch geladene Klassen. |
javax.management.modelmbean |
Beschreibung von Model-MBeans. |
javax.management.monitor |
Zur Beobachtung von MBeans. |
javax.management.openmbean |
Definition der Open MBean als spezielle MBean. |
javax.management.relation |
Verbindet MBeans im MBean-Server. |
javax.management.remote |
Remote-Zugriff auf einen JMX-MBean Server. |
javax.management.remote.rmi |
Über RMI Remote-Zugriff auf MBean-Server. |
javax.management.timer |
Timer MBean meldet nach Zeitablauf Ereignisse. |
javax.naming |
Zugriff auf Namensdienste. |
javax.naming.directory |
Zugriff auf Verzeichnisdienste, erweitert das javax.naming-Paket. |
javax.naming.event |
Ereignisse, wenn sich etwas beim Verzeichnisdienst ändert. |
javax.naming.ldap |
Unterstützung von LDAPv3-Operationen. |
javax.net |
Klassen mit einer Socket-Fabrik. |
javax.net.ssl |
SSL-Verschlüsselung. |
javax.print |
Java Print Service API. |
javax.print.attribute |
Attribute (wie Anzahl der Seiten, Ausrichtung) beim Java Print Service. |
javax.print.attribute.standard |
Standard für einige Drucker-Attribute. |
javax.print.event |
Ereignisse beim Drucken. |
javax.rmi |
Nutzen von RMI über das CORBA-Protokoll RMI-IIOP. |
javax.rmi.CORBA |
Unterstützt Portabilität von RMI-IIOP. |
javax.rmi.ssl |
Mit SSL mehr Sicherheit bei RMI-Verbindungen. |
javax.script |
Scripting-API zum Einbinden von Skriptsprachen. |
javax.security.auth |
Framework für Authentifizierung und Autorisierung. |
javax.security.auth.callback |
Informationen wie Benutzernamen oder Passwort vom Server beziehen. |
javax.security.auth.kerberos |
Unterstützung von Kerberos zur Authentifizierung in Netzwerken. |
javax.security.auth.login |
Framework für die Authentifizierungsdienste. |
javax.security.auth.x500 |
Für X.509-Zertifikate, X.500 Principal und X500 PrivateCredential. |
javax.security.cert |
Public-Key-Zertifikate. |
javax.security.sasl |
Unterstützung für SASL (Simple Authentication and Security Layer). |
javax.sound.midi |
Ein- und Ausgabe, Synthetisierung von MIDI-Daten. |
javax.sound.sampled |
Schnittstellen zur Ausgabe und Verarbeitung von Audio-Daten. |
javax.sql |
Datenquellen auf Serverseite. |
javax.sql.rowset |
Implementierung von RowSet. Mit Unterpaketen. |
javax.swing |
Einfache Swing-Komponenten. |
javax.swing.border |
Grafische Rahmen für die Swing-Komponenten. |
javax.swing.colorchooser |
Anzeige vom JColorChooser, einer Komponente für die Farbauswahl. |
javax.swing.event |
Ereignisse der Swing-Komponenten. |
javax.swing.filechooser |
Dateiauswahldialog unter Swing: JFileChooser. |
javax.swing.plaf |
Unterstützt auswechselbares Äußeres bei Swing durch ab-strakte Klassen. |
javax.swing.plaf.basic |
Basisimplementierung vom Erscheinungsbild der Swing-Komponenten. |
javax.swing.plaf.metal |
Plattformunabhängiges Standarderscheinungsbild von Swing-Komponenten. |
javax.swing.plaf.multi |
Benutzerschnittstellen, die mehrere Erscheinungsbilder kombinieren. |
javax.swing.plaf.synth |
Swing-Look-and-Feel aus XML-Dateien. |
javax.swing.table |
Typen rund um die grafische Tabellenkomponente javax.swing.JTable. |
javax.swing.text |
Unterstützung für Textkomponenten. |
javax.swing.text.html |
HTMLEditorKit zur Anzeige und Verwaltung eines HTML-Texteditors. |
javax.swing.text.html.parser |
Einlesen, Visualisieren und Strukturieren von HTML-Dateien. |
javax.swing.text.rtf |
Editorkomponente für Texte im Rich-Text-Format (RTF). |
javax.swing.tree |
Zubehör für die grafische Baumansicht javax.swing.JTree. |
javax.swing.undo |
Undo- oder Redo-Operationen, etwa für einen Texteditor. |
javax.tools |
Ansprachen von Java-Tool; im Moment nur der Compiler. |
javax.transaction |
Ausnahmen bei Transaktionen. |
javax.transaction.xa |
Beziehung zwischen Transactions-Manager und Resource-Manager für Java Transaction API (JTA), besonders für verteilte Transaktionen (Distributed Transaction Processing: The XA Specification). |
javax.xml |
Konstanten aus der XML-Spezifikation. |
javax.xml.bind |
JAXB-Typen zum Binden von XML-Strukturen an Objekte. |
javax.xml.bind.annotation |
Im Wesentlichen JAXB 2.0-Annotationen. |
javax.xml.bind.annotation.adapters |
Zur Behandlung von beliebigen Java-Klassen, die JAXB auf XML-Strukturen abbilden. |
javax.xml.bind.attachment |
Attachements von JAXB. |
javax.xml.bind.util |
Utility-Klassen für JAXB. |
javax.xml.crypto |
Klassen für XML-Signaturen oder zur Verschlüsselung von XML-Daten. |
javax.xml.datatype |
Schema-Datentypen für Dauer und gregorianischen Kalender. |
javax.xml.namespace |
QName für den Namensraum. |
javax.xml.parsers |
Einlesen von XML-Dokumenten. |
javax.xml.soap |
Aufbau von SOAP-Nachrichten. |
javax.xml.stream |
StAX-API für XML Pull-Parser. |
javax.xml.transform |
Allgemeine Schnittstellen zur Transformation von XML-Dokumenten. |
javax.xml.transform.dom |
Implementiert Transformationen auf der Basis von XML-Parsern nach dem DOM-Standard. |
javax.xml.transform.sax |
Implementiert Transformationen auf der Basis von XML-Parsern nach dem SAX2-Standard. |
javax.xml.transform.stream |
Transformationen auf der Basis von linearisierten XML-Dokumenten. |
javax.xml.validation |
Validation nach einem Schema. |
javax.xml.ws |
JAX-WS API. |
javax.xml.xpath |
XPath API. |
org.ietf.jgss |
Framework für Sicherheitsdienste wie Authentifizierung, Integrität, Vertraulichkeit. |
org.w3c.dom |
Klassen für die Baumstruktur eines XML-Dokuments nach DOM-Standard. |
org.w3c.dom.events |
DOM-Events. |
org.w3c.dom.ls |
Laden und Speichern von XML-Strukturen. |
org.xml.sax |
Ereignisse, die beim Einlesen eines XML-Dokuments nach dem SAX-Standard auftreten. |
org.xml.sax.ext |
Zusätzliche Behandlungsroutinen für SAX2-Ereignisse. |
org.xml.sax.helpers |
Adapterklassen und Standardimplementierungen. |
Daneben deklariert das Paket org.omg eine Reihe von Unterpaketen mit CORBA-Diensten, die für unsere Betrachtung jedoch zu speziell sind. SPI-Pakete (SPI steht für Service Provider Implementation) definieren Verhalten für Anbieter bestimmter Funktionalitäten und sind ebenfalls nicht genannt.
Standard Extension API
Einige der Java-Pakete beginnen mit javax. Dies sind Erweiterungspakete (extensions), die die Kern-Klassen ergänzen. Im Laufe der Zeit sind jedoch viele der früher zusätzlich einzubindenden Pakete in die Standard-Distribution gewandert, sodass heute ein recht großer Anteil mit javax beginnt, aber keine Erweiterungen mehr darstellt, die zusätzlich installiert werden müssen. Sun wollte die Pakete nicht umbenennen, um so eine Migration nicht zu erschweren. Fällt heute im Quellcode ein Paketname mit javax auf, ist es daher nicht mehr so einfach zu entscheiden, ob eine externe Quelle mit eingebunden werden muss beziehungsweise ab welcher Java-Version das Paket Teil der Distribution ist.
Echte externe Pakete von Sun sind unter anderem:
- Enterprise/Server API mit den Enterprise JavaBeans, Servlets und JavaServer Faces
- Java Persistence API (JPA) zum Abbilden von Objekten auf relationale Datenbanken
- Java Communications API für serielle und parallele Schnittstelle
- Java Telephony API
- Sprachein-/ausgabe mit der Java Speech API
- JavaSpaces für gemeinsamen Speicher unterschiedlicher Laufzeitumgebungen
- JXTA zum Aufbauen von P2P-Netzwerken
Hinweis Die Laufzeitumgebung von Sun liefert noch über 3.000 Klassendateien in den Paketen sun und sunw aus. Diese internen Klassen sind nicht offiziell dokumentiert [Das Buch »Java Secrets« von Elliotte Rusty Harold geht den Klassen nach, ist aber schon älter.], aber zum Teil sehr leistungsfähig und erlauben selbst direkten Speicherzugriff oder können Objekte ohne Standard-Konstruktor erzeugen: Listing 10.1 com/tutego/insel/sun/UnsafeInstance.java, Ausschnitt Field field = Unsafe.class.getDeclaredField( "theUnsafe" ); field.setAccessible( true ); sun.misc.Unsafe unsafe = (sun.misc.Unsafe) field.get( null ); File f = (File) unsafe.allocateInstance( File.class ); System.out.println( f.getPath() ); // null |
File hat keinen Standard-Konstruktor, nicht einmal einen privaten. Diese Art der Objekterzeugung kann bei der Deserialisierung (siehe dazu Kapitel 14, »Dateien und Datenströme«) hilfreich sein. |