1507.book Seite 41 Mittwoch, 12. Oktober 2011 12:49 12 Kapitel 1 1 Neues in Java 7 »Jede Lösung eines Problems ist ein neues Problem.« – Johann Wolfgang von Goethe (1749–1832) 1.1 Sprachänderungen Die folgenden Abschnitte stellen Sprachänderungen aus Java 7 vor. 1.1.1 Zahlen im Binärsystem schreiben Die Literale für Ganzzahlen lassen sich in vier unterschiedlichen Stellenwertsystemen angeben. Das natürlichste ist das Dezimalsystem (auch Zehnersystem genannt), bei dem die Literale aus den Ziffern »0« bis »9« bestehen. Zusätzlich existieren Oktal- und Hexadezimalsysteme, und seit Java 7 die Binärschreibweise. Bis auf Dezimalzahlen beginnen die Zahlen in anderen Formaten mit einem besonderen Präfix. Präfix Stellenwertsystem Basis Darstellung von 1 0b oder 0B Binär 2 0b1 oder 0B1 0 Oktal 8 01 Kein Dezimal 10 1 0x oder 0X Hexadezimal 16 0x1 oder 0X1 Tabelle 1.1: Die Stellenwertsysteme und ihre Schreibweise 1.1.2 Unterstriche bei Ganzzahlen Um eine Anzahl von Millisekunden in Tage zu konvertieren, muss einfach eine Division vorgenommen werden. Um Millisekunden in Sekunden umzurechnen, brauchen wir eine Division durch 1000, von Sekunden auf Minuten eine Division durch 60, von Minuten auf Stun- 41 1507.book Seite 42 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 den eine Division durch 60, und die Stunden auf Tage bringt die letzte Division durch 24. Schreiben wir das auf: long millis = 10 * 24*60*60*1000L; long days = millis / 86400000L; System.out.println( days ); // 10 Eine Sache fällt bei der Zahl 86400000 auf: Besonders gut lesbar ist sie nicht. Die eine Lösung ist, es erst gar nicht zu so einer Zahl kommen zu lassen und sie wie in der ersten Zeile durch eine Reihe von Multiplikationen aufzubauen – mehr Laufzeit kostet das nicht, da dieser konstante Ausdruck zur Übersetzungszeit feststeht. Die zweite Variante ist eine neue Schreibweise, die Java 7 einführt: Unterstriche in Zahlen. Anstatt ein numerisches Literal als 86400000 zu schreiben, ist in Java 7 auch Folgendes erlaubt: long millis = 10 * 86_400_000L; long days = millis / 86_400_000L; System.out.println( days ); // 10 Die Unterstriche machen die 1000er-Blöcke gut sichtbar. Hilfreich ist die Schreibweise auch bei Literalen in Binär- und Hexdarstellung, da die Unterstriche hier ebenfalls Blöcke absetzen können.1 Beispiel Unterstriche verdeutlichen Blöcke bei Binär- und Hexadezimalzahlen. int i = 0b01101001_01001101_11100101_01011110; long l = 0x7fff_ffff_ffff_ffffL; Der Unterstrich darf in jedem Literal stehen, zwei aufeinanderfolgende Unterstriche sind aber nicht erlaubt. 1.1.3 switch (String) Seit Java 7 sind switch-Anweisungen auf String-Objekten möglich. String input = javax.swing.JOptionPane.showInputDialog( "Eingabe" ); switch ( input.toLowerCase() ) 1 42 Bei Umrechnungen zwischen Stunden, Minuten und so weiter hilft auch die Klasse TimeUnit mit einigen statischen toXXX()-Methoden. 1507.book Seite 43 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen { 1 case "kekse": System.out.println( "Ich mag Keeeekse" ); break; case "kuchen": System.out.println( "Ich mag Kuchen" ); break; case "scholokade": case "lakritze": System.out.println( "Hm. lecker" ); break; default: System.out.printf( "Kann man %s essen?", input ); } Obwohl Zeichenkettenvergleiche nun möglich sind, fallen Überprüfungen auf reguläre Ausdrücke leider heraus, die insbesondere Skriptsprachen anbieten. Wie auch beim switch mit Ganzzahlen können die Zeichenketten beim String-case-Zweig aus finalen (also nicht änderbaren) Variablen stammen. Ist etwa String KEKSE = "kekse"; vordefiniert, ist case KEKSE: erlaubt. 1.1.4 Zusammenfassen gleicher catch-Blöcke mit dem multi-catch Greift ein Programm auf Teile zurück, die scheitern können, so ergeben sich in komplexeren Abläufen schnell Situationen, in denen unterschiedliche Ausnahmen auftreten können. Entwickler sollten versuchen, den Programmcode in einem try-Block durchzuschreiben, und dann in catch-Blöcken auf alle möglichen Fehler zu reagieren, die den Block vom korrekten Durchlaufen abgehalten haben. Oftmals kommt es zu dem Phänomen, dass die aufgerufenen Programmteile unterschiedliche Ausnahmetypen auslösen, aber die Behandlung der Fehler gleich aussieht. Um Quellcodeduplizierung zu vermeiden, sollte der Programmcode zusammengefasst werden. Nehmen wir an, die Behandlung der Ausnahmen SQLException und IOException soll gleich sein. Wir haben schon gesehen, dass ein catch(Exception e) keine gute Lösung ist und nie im Programmcode vorkommen sollte, denn dann würden auch andere Ausnahmen mitgefangen. Zum Glück gibt es in Java 7 eine elegante Lösung. 43 1507.book Seite 44 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 Multi-catch Java 7 führt eine neue Schreibweise für catch-Anweisungen ein, um mehrere Ausnahmen auf einmal aufzufangen; sie heißt multi-catch. In der abgewandelten Variante von catch steht dann nicht mehr nur eine Ausnahme, sondern eine Sammlung von Ausnahmen, die ein »|« trennt. Der Schrägstrich ist schon als Oder-Operator bekannt und wurde daher auch hier eingesetzt, denn die Ausnahmen sind ja auch als eine Oder-Verknüpfung zu verstehen. Die allgemeine Syntax ist: try { ... } catch ( E1 | E2 | ... | En exception ) Die Variable exception ist implizit final. Um das multi-catch zu demonstrieren, nehmen wir ein Programm an, das eine Farbtabelle einliest. Die Datei besteht aus mehreren Zeilen, wobei in jeder Zeile die erste Zahl einen Index repräsentiert und die zweite Zahl den hexadezimalen RGB-Farbwert. Listing 1.1: basiscolors.txt 0 000000 1 ff0000 8 00ff00 9 ffff00 Eine eigene Methode readColorTable() soll die Datei einlesen und ein int-Feld der Größe 256 als Rückgabe liefern, wobei an den in der Datei angegebeen Positionen jeweils die Farbwerte eingetragen sind. Nicht belegte Positionen bleiben 0. Gibt es einen Ladefehler, soll die Rückgabe null sein und die Methode eine Meldung auf dem Fehlerausgabekanal ausgeben. Das Einlesen soll die Scanner-Klasse übernehmen. Bei der Verarbeitung der Daten und der Füllung des Feldes sind diverse Fehler denkbar: Þ IOException: Die Datei ist nicht vorhanden, oder während des Einlesens kommt es zu Pro- blemen. Þ InputMismatchException: Der Index oder die Hexadezimalzahl sind keine Zahlen (einmal zur Basis 10, und dann zur Basis 16). Den Fehlertyp löst der Scanner aus. Þ ArrayIndexOutOfBoundsException: Der Index liegt nicht im Bereich von 0 bis 255. Während der erste Fehler beim Dateisystem zu suchen ist, sind die zwei unteren Fehler – unabhängig davon, dass sie ungeprüfte Ausnahmen sind – auf ein fehlerhaftes Format zurück- 44 1507.book Seite 45 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen zuführen. Die Behandlung soll immer gleich aussehen und kann daher gut in einem multicatch zusammengefasst werden. Daraus folgt: Listing 1.2: ReadColorTable.java import java.io.*; import java.util.Scanner; public class ReadColorTable { private static int[] readColorTable( String filename ) { Scanner input; int[] colors = new int[ 256 ]; try { input = new Scanner( new File(filename) ); while ( input.hasNextLine() ) { int index = input.nextInt(); int rgb = input.nextInt( 16 ); colors[ index ] = rgb; } return colors; } catch ( IOException e ) { System.err.printf( "Dateioperationen fehlgeschlagen%n%s%n", e ); } catch ( InputMismatchException | ArrayIndexOutOfBoundsException e ) { System.err.printf( "Datenformat falsch%n%s%n", e ); } finally { input.close(); } return null; } 45 1 1507.book Seite 46 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 public static void main( String[] args ) { readColorTable( "basiscolors.txt" ); } } Multi-catch-Blöcke sind also eine Abkürzung, und der Bytecode sieht genauso aus wie mehrere gesetzte catch-Blöcke, also wie: catch ( InputMismatchException e ) { System.err.printf( "Datenformat falsch%n%s%n", e ); } catch ( ArrayIndexOutOfBoundsException e ) { System.err.printf( "Datenformat falsch%n%s%n", e ); } Multi-catch-Blöcke sind nur eine Abkürzung, daher teilen sie auch die Eigenschaften der normalen catch-Blöcke. Der Compiler führt die gleichen Prüfungen wie bisher durch, also ob etwa die genannten Ausnahmen im try-Block überhaupt ausgelöst werden können. Nur das, was in der durch »|« getrennten Liste aufgezählt ist, wird behandelt; unser Programm fängt zum Beispiel nicht generisch alle RuntimeExceptions ab. Und genauso dürfen die in catch oder multicatch genannten Ausnahmen nicht in einem anderen (multi)-catch auftauchen. Neben den Standard-Tests kommen neue Überprüfungen hinzu, ob etwa die exakt gleiche Exception zweimal in der Liste ist oder ob es Widersprüche durch Mengenbeziehungen gibt. Hinweis Der folgende multi-catch ist falsch: try { new RandomAccessFile("", ""); } catch ( FileNotFoundException | IOException | Exception e ) { } Der javac-Compiler meldet einen Fehler der Art »Alternatives in a multi-catch statement cannot be related by subclassing« und bricht ab. 46 1507.book Seite 47 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen 1 Hinweis (Forts.) Mengenprüfungen führt der Compiler auch ohne multi-catch durch, und Folgendes ist ebenfalls falsch: try { new RandomAccessFile("", ""); } catch ( Exception e ) { } catch ( IOException e ) { } catch ( FileNotFoundException e ) { } Während allerdings eine Umsortierung der Zeilen die Fehler korrigiert, spielt die Reihenfolge bei multi-catch keine Rolle. 1.1.5 Präzisiertes rethrows Die Notwendigkeit, Ausnahmen über einen Basistyp zu fangen, ist mit dem Einzug vom multi-catch gesunken. Doch für gewisse Programmteile ist es immer noch praktisch, alle Fehler eines gewissen Typs aufzufangen. Wir können auch so weit in der Ausnahmehierarchie nach oben laufen, um alle Fehler aufzufangen – dann haben wir es mit einem try { ... } catch(Throwable t){ ... } zu tun. Ein multi-catch ist für geprüfte Ausnahmen besonders gut, aber bei ungeprüften Ausnahmen ist eben nicht immer klar, was als Fehler denn so ausgelöst wird, und ein catch(Throwable t) hat den Vorteil, dass es alles wegfischt. Problemstellung Werden Ausnahmen über einen Basistyp gefangen und wird diese Ausnahme mit throw weitergeleitet, dann ist es naheliegend, dass der aufgefangene Typ genau der Typ ist, der auch bei throws in der Methodensignatur stehen muss. Stellen wir uns vor, ein Programmblock nimmt einen Screenshot und speichert ihn in einer Datei. Kommt es beim Abspeichern zu einem Fehler, soll das, was vielleicht schon in die Datei geschrieben wurde, gelöscht werden; die Regel ist also: Entweder steht der Screenshot komplett in der Datei oder es gibt gar keine Datei. Die Methode kann so aussehen, wobei die Ausnahmen an den Aufrufer weitergegeben werden sollen: public static void saveScreenshot( String filename ) throws AWTException, IOException { try { Rectangle r = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() ); 47 1507.book Seite 48 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 BufferedImage screenshot = new Robot().createScreenCapture( r ); ImageIO.write( screenshot, "png", new File( filename ) ); } catch ( AWTException e ) { throw e; } catch ( IOException e ) { new File( filename ).delete(); throw e; } } Mit den beiden catch-Blöcken sind wir genau auf die Ausnahmen eingegangen, die createScreenCapture() und write() auslösen. Das ist richtig, aber löschen wir wirklich immer die Dateireste, wenn es Probleme beim Schreiben gibt? Richtig ist, dass wir immer dann die Datei löschen, wenn es zu einer IOException kommt. Aber was passiert, wenn die Implementierung eine RuntimeException auslöst? Dann wird die Datei nicht gelöscht, aber das ist gefragt! Das scheint einfach gefixt, denn statt catch ( IOException e ) { new File( filename ).delete(); throw e; } schreiben wir: catch ( Throwable e ) { new File( filename ).delete(); throw e; } Doch können wir das Problem so lösen? Der Typ Throwable passt doch gar nicht mehr mit dem deklarierten Typ IOException in der Methodensignatur zusammen: public static void saveScreenshot( String filename ) throws AWTException /*1*/, IOException /*2*/ { 48 1507.book Seite 49 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen ... 1 catch ( AWTException /*1*/ e ) { throw e; } catch ( Throwable /*?*/ e ) { new File( filename ).delete(); throw e; } } Die erste catch-Klausel fängt AWTException und leitet es weiter. Damit wird saveScreenshot() zum möglichen Auslöser von AWTException und die Ausnahme muss mit throws an die Signatur. Wenn nun ein catch-Block jedes Throwable auffängt und diesen Throwable-Fehler weiterleitet, ist zu erwarten, dass an der Signatur auch Throwable stehen muss und IOException nicht reicht. Das war auch bis Java 6 so, aber in Java 7 kam eine Anpassung. Neu seit Java 7: eine präzisere Typprüfung In Java 7 hat der Compiler eine kleine Veränderung erfahren, von einer unpräziseren zu einer präziseren Typanalyse: Immer dann, wenn in einem catch-Block ein throw stattfindet, ermittelt der Compiler die im try-Block tatsächlich aufgetretenen geprüften Exception-Typen und schenkt dem im catch genannten Typ für das rethrow im Prinzip keine Beachtung. Statt dem gefangenen Typ wird der Compiler den durch die Codeanalyse gefundenen Typ beim rethrow melden. Der Compiler erlaubt nur dann das präzise rethrow, wenn die catch-Variable nicht verändert wird. Zwar ist eine Veränderung einer nicht-finalen catch-Variablen wie auch unter Java 1.0 erlaubt, doch wenn die Variable belegt wird, schaltet der Compiler von der präzisen in die unpräzise Erkennung zurück. Führen wir etwa die folgende Zuweisung ein, so funktioniert das Ganze schon nicht mehr: catch ( Throwable e ) { new File( filename ).delete(); e = new IllegalStateException(); throw e; } 49 1507.book Seite 50 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 Die Zuweisung führt zu dem Compilerhinweis, dass jetzt auch Throwable mit in die throwsKlausel muss. 2 Stilfrage Die catch-Variable kann für die präzisere Typprüfung den Modifizierer final tragen, muss das aber nicht tun. Immer dann, wenn es keine Veränderung an der Variablen gibt, wird der Compiler sie als final betrachten und eine präzisere Typprüfung durchführen – daher nennt sich das auch effektiv final. Die Java Language Specification rät vom final-Modifizierer aus Stilgründen ab. Ab Java 7 ist es das Standardverhalten, und daher ist es Quatsch, überall ein final dazuzuschreiben, um die präzisere Typprüfung zu dokumentieren. Migrationsdetail Da der Compiler nun mehr Typwissen hat, stellt sich die Frage, ob alter Programmode mit dem neuen präziseren Verhalten vielleicht ungültig werden könnte. Theoretisch ist das möglich, aber die Sprachdesigner haben in über 9 Millionen Zeilen Code2 von unterschiedlichen Projekten keine Probleme gefunden. Prinzipiell könnte der Compiler jetzt unerreichbaren Code finden, der vorher versteckt blieb. Ein kleines Beispiel, was vor Java 7 compiliert, aber ab Java 7 nicht mehr: try { throw new FileNotFoundException(); } catch ( IOException e ) { try { throw e; // e ist für den Compiler vom Typ FileNotFoundException } catch ( MalformedURLException f ) { } } Die Variable e in catch (IOException e) ist effektiv final, und der Compiler führt die präzisere Typerkennung durch. Er findet heraus, dass der wahre rethrow-Typ nicht IOException, sondern FileNotFoundException ist. Wenn dieser Typ dann mit throw e weitergeleitet wird, kann ihn catch(MalformedURLException) nicht auffangen. 2 50 Die Zahl stammt aus der FOSDEM 2011-Präsentation »Project Coin: Language Evolution in the Open«. 1507.book Seite 51 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen 1 Migrationsdetail (Forts.) Unter Java 6 war das etwas anders, denn hier wusste der Compiler nur, dass e irgendeine IOException ist, und es hätte ja durchaus die IOException-Unterklasse MalformedURLException sein können. (Warum MalformedURLException aber eine Unterklasse von IOException ist, steht auf einem ganz anderen Blatt.) 1.1.6 Automatisches Ressourcen-Management (try mit Ressourcen) Java hat eine automatische Garbage-Collection (GC), sodass nicht mehr referenzierte Objekte erkannt und ihr Speicher automatisch freigegeben wird. Nun bezieht sich die GC aber ausschließlich auf Speicher, doch es gibt viele weitere Ressourcen: Þ Dateisystem-Ressourcen von Dateien Þ Netzwerkressourcen wie Socket-Verbindungen Þ Datenbankverbindungen Þ nativ gebundene Ressourcen vom Grafiksubsystem Þ Synchronisationsobjekte Auch hier gilt es, nach getaner Arbeit aufzuräumen und Ressourcen freizugeben, etwa Dateien und Datenbankverbindungen zu schließen. Mit dem try-catch-finally-Konstrukt haben wir gesehen, wie Ressourcen freizugeben sind. Doch es lässt sich auch ablesen, dass relativ viel Quellcode geschrieben werden muss und der try-catch-finally drei Unfeinheiten hat: 1. Sollte eine Variable in finally zugänglich sein, muss sie außerhalb des try-Blocks deklariert werden, was ihr eine höhere Sichtbarkeit als nötig gibt. 2. Das Schließen der Ressourcen bringt oft ein zusätzliches try-catch mit sich. 3. Eine im finally ausgelöste Ausnahme (etwa beim close()) überdeckt die im try-Block ausgelöste Ausnahme. 1.1.7 try mit Ressourcen Um das Schließen von Ressourcen zu vereinfachen, wurde in Java 7 eine besondere Form der try-Anweisung eingeführt, die try mit Ressourcen genannt werden. Mit ihm lassen sich Ressource-Typen, die die Schnittstelle java.lang.AutoCloseable implementieren, automatisch schließen. Ein-/Ausgabeklassen wie Scanner, InputStream und Writer, implementieren diese Schnittstelle und können direkt verwendet werden. Weil try mit Ressourcen dem Automatic Resource Management dient, heißt der spezielle try-Block auch ARM-Block. 51 1507.book Seite 52 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 Gehen wir in die Praxis: Aus einer Datei soll mit einem Scanner die erste Zeile gelesen und ausgegeben werden. Nach dem Lesen soll der Scanner geschlossen werden. Die linke Seite der folgenden Tabelle nutzt die spezielle Syntax, die rechte Seite ist im Prinzip die Übersetzung, allerdings noch etwas vereinfacht, wie wir später genauer sehen werden. try mit Ressourcen Vereinfachte ausgeschriebene Implementierung InputStream in = InputStream in = ClassLoader.getSystemResourceAsStream( ClassLoader.getSystemResourceAsStream( "EastOfJava.txt" ); "EastOfJava.txt" ); try ( Scanner res = { final Scanner res = new Scanner( in ) ) new Scanner( file ); { try System.out.println( { res.nextLine() ); System.out.println( } res.nextLine() ); } finally { res.close(); } } Tabelle 1.2: Die main()-Methode von TryWithResources1 und ihre prinzipielle Umsetzung Üblicherweise folgt nach dem Schlüsselwort try ein Block, doch try-mit-Ressourcen nutzt eine eigene spezielle Syntax. 1. Nach dem try folgt statt dem direkten {}-Block eine Anweisung in runden Klammern, und dann erst der {}-Block, also try (...) {...} statt try {...}. 2. In den runden Klammern findet man eine lokale Variablendeklaration (die Variable ist automatisch final) mit einer Zuweisung. Die Ressourcenvariable muss vom Typ AutoCloseable sein. Rechts vom Gleichheitszeichen steht ein Ausdruck, etwa ein Konstruktor- oder Methodenaufruf. Der Typ des Ausdrucks muss natürlich auch intanceof AutoCloseable sein. Die in dem try deklarierte lokale AutoCloseable-Variable ist nur in dem Block gültig und wird automatisch freigegeben, gleichgültig ob der ARM-Block korrekt durchlaufen wurde oder ob es bei der Abarbeitung zu einem Fehler kam. Der Compiler fügt alle nötigen Prüfungen ein. 52 1507.book Seite 53 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen 1.1.8 Ausnahmen vom close() bleiben bestehen 1 Unser Scanner-Beispiel hat eine Besonderheit, denn keine der Methoden löst eine geprüfte Ausnahme aus – weder getSystemResourceAsStream(), new Scanner(InputStream), nextLine() noch das close(), was try-mit-Ressourcen automatisch aufruft. Anders ist es, wenn die Ressource ein InputStream ist, denn dort deklariert die close()-Methode eine IOException. Die muss daher auch behandelt werden, wie es das folgende Beispiel zeigt: Listing 1.3: TryWithResourcesReadsLine, readFirstLine() static String readFirstLine( File file ) { try ( BufferedReader br = new BufferedReader(new FileReader(file) ) ) { return br.readLine(); } catch ( IOException e ) { e.printStackTrace(); return null; } } Wenn try-mit-Ressourcen verwendet wird, bleibt die Ausnahme bestehen; es zaubert die Ausnahmen beim catch also nicht weg. Hinweis Löst close() eine geprüfte Ausnahme aus, und wird diese nicht behandelt, so kommt es zum Compilerfehler. Die close()-Methode vom BufferedReader löst zum Beispiel eine IOException aus, sodass sich die folgende Methode nicht übersetzen lässt: void no() { try ( Reader r = new BufferedReader(null) ) { } // Compilerfehler } Der Ausdruck new BufferedReader(null) benötigt keine Behandlung, denn der Konstruktor löst keine Ausnahme aus. Einzig der nicht behandelte Fehler von close() führt zu »exception thrown from implicit call to close() on resource variable 'r'«. 1.1.9 Die Schnittstelle AutoCloseable Die ARM-Anweisung schließt Ressourcen vom Typ AutoCloseable. Daher wird es Zeit, sich diese Schnittstelle etwas genauer anzuschauen: 53 1507.book Seite 54 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 package java.lang; public interface AutoCloseable { void close() throws Exception; } Anders als das übliche close() ist die Ausnahme deutlich allgemeiner mit Exception angegeben; die Ein-/Ausgabe-Klassen lösen beim Misslingen immer eine IOException aus, aber jede Klasse hat eigene Ausnahmetypen: Typ Signatur java.io.Scanner close() // ohne Ausnahme javax.sound.sampled.Line close() // ohne Ausnahme java.io.FileInputStream close() throws IOException java.sql.Connection close() throws SQLException Tabelle 1.3: Einige Typen, die AutoCloseable implementieren Eine Unterklasse darf die Ausnahme ja auch weglassen, das machen Klassen wie der Scanner, der keine Ausnahme weiterleitet, sondern sie intern schluckt – wenn es Ausnahmen gab, liefert sie die Scanner-Methode ioException(). AutoCloseable und Closeable Auf den ersten Blick einleuchtend wäre es, die schon existierende Schnittstelle Closeable als Typ zu nutzen. Doch das hätte Nachteile: Die close()-Methode ist mit einem throws IOException deklariert, was bei einer allgemeinen automatischen Ressourcen-Freigabe unpassend ist, wenn etwa ein Grafikobjekt bei der Freigabe eine IOException auslöst. Vielmehr ist der Weg anders herum: Closeable erweitert AutoCloseable, denn das Schließen von Ein-/Ausgabe-Ressourcen ist eine besondere Art, allgemeine Ressourcen zu schließen. package java.io; import java.io.IOException; public interface Closeable extends AutoCloseable { void close() throws IOException; } 54 1507.book Seite 55 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen Wer ist AutoCloseable? 1 Da alle Klassen, die Closeable implementieren, auch automatisch vom Typ AutoCloseable sind, kommen schon einige Typen zusammen. Im Wesentlichen sind es aber Klassen aus dem java.io-Paket, wie Channel-, Reader-, Writer-Implementierungen, FileLock, XMLDecoder und noch ein paar Exoten wie URLClassLoader, ImageOutputStream. Auch Typen aus dem java.sql-Paket gehören zu den Nutznießern. Klassen aus dem Bereich Threading, wo etwa ein Lock wieder freigeben werden könnte, oder Grafik-Anwendungen, bei denen der Grafik-Kontext wieder freigegeben werden muss, gehören nicht dazu. 1.1.10 Mehrere Ressourcen nutzen Unsere beiden Beispiele zeigten die Nutzung eines Ressource-Typs. Es sind aber auch mehrere Typen möglich, die dann mit einem Semikolon getrennt werden: try ( InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest) ) { ... } Hinweis Die Trennung erledigt ein Semikolon, und jedes Segment kann einen unterschiedlichen Typ deklarieren, etwa InputStream/OutputStream. Die Ressourcen-Typen müssen also nicht gleich sein, und auch wenn sie es sind, muss der Typ immer neu geschrieben werden, also etwa: try ( InputStream in1 = ...; InputStream in2 = ... ) Es ist ungültig, Folgendes zu schreiben: try ( InputStream in1 = ..., in2 = ... ) // Compilerfehler Wenn es beim Anlegen in der Kette zu einem Fehler kommt, wird nur das geschlossen, was auch aufgemacht wurde. Wenn es also bei der ersten Initialisierung von in1 schon zu einer Ausnahme kommt, wird die Belegung von in2 erst gar nicht begonnen und daher auch nicht geschlossen. (Intern setzt der Compiler das als geschachtelte try-catch-finally-Blöcke um.) Beispiel Am Schluss der Ressourcensammlung kann – muss aber nicht – ein Semikolon stehen, so wie auch bei Feldinitialisierungen zum Schluss ein Komma stehen kann: int[] array = { 1, 2, }; // ^ Komma optional 55 1507.book Seite 56 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 Beispiel (Forts.) try ( InputStream in = new FileInputStream(src); ) { ... } // ^ Semikolon optional try ( InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); ) { ... } // ^ Semikolon optional Ob das stilvoll ist, muss jeder selbst entscheiden; in der Insel steht kein unnützes Zeichen. 1.1.11 Unterdrückte Ausnahmen * Aufmerksame Leser haben bestimmt schon ein Detail wahrgenommen: Im Text steht »vereinfachte ausgeschriebene Implementierung«, was vermuten lässt, dass es ganz so einfach doch nicht ist. Das stimmt, denn es können zwei Ausnahmen auftauchen, die einiges an Sonderbehandlung benötigen: Þ Ausnahme im try-Block. An sich unproblematisch. Þ Ausnahme beim close(). Auch an sich unproblematisch. Aber es gibt mehrere close()-Auf- rufe, wenn nicht nur eine Ressource verwendet wurde. Ungünstig. Þ Die Steigerung: Ausnahme im try-Block und dann auch noch Ausnahme(n) beim close(). Das ist ein echtes Problem! Eine Ausnahme alleine ist kein Problem, aber zwei Ausnahmen auf einmal bilden ein großes Problem, da ein Programmblock nur genau eine Ausnahme melden kann und nicht eine Sequenz von Ausnahmen. Daher sind verschiedene Fragen zu klären, falls der try-Block und close() beide eine Ausnahme auslösen: Þ Welche Ausnahme ist wichtiger? Die Ausnahme im try-Block oder die vom close()? Þ Wenn es zu zwei Ausnahmen kommt: Soll die von close() vielleicht immer verdeckt wer- den und immer nur die vom try-Block zum Anwender kommen? Þ Wenn beide Ausnahmen wichtig sind, wie sollen sie gemeldet werden? Wie haben sich die Java-Ingenieure entschieden? Eine Ausnahme bei close() darf bei einem gleichzeitigen Auftreten einer Exception im try-Block auf keinen Fall verschwinden.3 Wie also beide Ausnahmen melden? Hier gibt es einen Trick: Da die Ausnahme im try-Block wichtiger ist, ist sie die »Haupt-Ausnahme«, und die close()-Ausnahme kommt Huckepack als ExtraInformation mit oben drauf. 3 56 In einem frühen Prototyp war dies tatsächlich der Fall – die Ausnahme wurde komplett geschluckt. 1507.book Seite 57 Mittwoch, 12. Oktober 2011 12:49 12 1.1 Sprachänderungen Dieses Verhalten soll das nächste Beispiel zeigen. Um die Ausnahmen besser steuern zu können, soll eine eigene AutoCloseable-Implementierung eine Ausnahme in close() auslösen. Listing 1.4: SuppressedClosed.java public class SuppressedClosed { public static void main( String[] args ) { class NotCloseable implements AutoCloseable { @Override public void close() { throw new UnsupportedOperationException( "close() mag ich nicht" ); } } try ( NotCloseable res = new NotCloseable() ) { throw new NullPointerException(); } } } Das Programm löst also im close() und im try-Block eine Ausnahme aus. Das Resultat ist: Exception in thread "main" java.lang.NullPointerException at SuppressedClosed.main(SuppressedClosed.java:14) Suppressed: java.lang.UnsupportedOperationException: close() mag ich nicht at SuppressedClosed$1NotCloseable.close(SuppressedClosed.java:9) at SuppressedClosed.main(SuppressedClosed.java:15) Die interessante Zeile beginnt mit »Suppressed:«, denn dort ist die close()-Ausnahme referenziert. An den Aufrufer kommt die spannende Ausnahme vom misslungenen try-Block aber nicht direkt von close(), sondern verpackt in der Hauptausnahme und muss extra erfragt werden. Zum Vergleich: Kommentieren wir throw new NullPointerException() aus, gibt es nur noch die close()-Ausnahme und es folgt auf der Konsole: 57 1 1507.book Seite 58 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 Exception in thread "main" java.lang.UnsupportedOperationException: close() mag ich nicht at SuppressedClosed$1NotCloseable.close(SuppressedClosed.java:9) at SuppressedClosed.main(SuppressedClosed.java:15) Die Ausnahme ist also nicht irgendwo anders untergebracht, sondern die »Hauptausnahme«. Eine Steigerung ist, dass es mehr als eine Ausnahme beim Schließen geben kann. Simulieren wir auch dies wieder an einem Beispiel, indem wir unser Beispiel um eine Zeile ergänzen: try ( NotCloseable res1 = new NotCloseable(); NotCloseable res2 = new NotCloseable() ) { throw new NullPointerException(); } Aufgerufen führt dies zu: Exception in thread "main" java.lang.NullPointerException at SuppressedClosed.main(SuppressedClosed.java:15) Suppressed: java.lang.UnsupportedOperationException: close() mag ich nicht at SuppressedClosed$1NotCloseable.close(SuppressedClosed.java:9) at SuppressedClosed.main(SuppressedClosed.java:16) Suppressed: java.lang.UnsupportedOperationException: close() mag ich nicht at SuppressedClosed$1NotCloseable.close(SuppressedClosed.java:9) at SuppressedClosed.main(SuppressedClosed.java:16) Jede unterdrückte close()-Ausnahme taucht auf. Umsetzung Im Kapitel über finally wurde das Verhalten vorgestellt, dass eine Ausnahme im finally eine Ausnahme im try-Block unterdrückt. Der Compiler setzt bei der Umsetzung vom try-mit-Ressourcen das close() in einen finally-Block. Ausnahmen im finally-Block sollen eine mögliche Hauptausnahme aber nicht schlucken. Daher fängt die Umsetzung vom Compiler jede mögliche Ausnahme im try-Block ab sowie die close()-Ausnahme und hängt diese SchließAusnahme, falls vorhanden, an die Hauptausnahme. Spezielle Methoden in Throwable * Damit eine normale Exception die unterdrückten close()-Ausnahmen Huckepack nehmen kann, sind in der Basisklasse Throwable seit Java 7 zwei Methoden hinzugekommen: 58 1507.book Seite 59 Mittwoch, 12. Oktober 2011 12:49 12 1.2 JVM-Änderungen final class java.lang.Throwable 1 Þ final Throwable[] getSuppressed() Liefert alle unterdrückten Ausnahmen. Die printStackTrace()-Methode zeigt alle unterdrückten Ausnahmen und greift auf getSuppressed() zurück. Für Anwender wird es selten Anwendungsfälle für diese Methode geben. Þ final void addSuppressed(Throwable exception) Fügt eine neue unterdrückte Ausnahme hinzu. In der Regel ruft der finally-Block vom trymit-Ressourcen die Methode auf, doch wir können auch selbst die Methode nutzen, wenn wir mehr als eine Ausnahme melden wollen. Die Java-Bibliothek selbst nutzt das bisher nur an sehr wenigen Stellen. Neben den beiden Methoden gibt es einen protected-Konstruktor, der bestimmt, ob es überhaupt unterdrückte Ausnahmen geben soll oder ob sie nicht vielleicht komplett geschluckt werden. Wenn, dann zeigt sie auch printStackTrace() nicht mehr an. Blick über den Tellerrand In C++ gibt es Dekonstruktoren, die beliebige Anweisungen ausführen, wenn ein Objekt freigegeben wird. Hier lässt sich auch das Schließen von Ressourcen realisieren. C# nutzt statt try das spezielle Schlüsselwort using, mit Typen, die die Schnittstelle IDisposable implementieren, mit einer Methode Dispose() statt close(). (In Java sollte die Schnittstelle ursprünglich auch Disposable statt nun AutoCloseable heißen.) In Python 2.5 wurde ein context management protocol mit dem Schlüsselwort with realisiert, sodass Python automatisch bei Betreten eines Blockes __enter__() aufruft und beim Verlassen die Methode __exit__(). Das ist insofern interessant, als dass hier zwei Methoden zur Verfügung stehen. Bei Java ist es nur close() beim Verlassen des Blockes, aber es gibt keine Methode zum Betreten eines Blockes; so etwas muss beim Anlegen der Ressource erledigt werden. 1.2 JVM-Änderungen Wenn es um Java geht, müssen wir immer unterscheiden, ob es um die Sprache selbst geht, um die Bibliotheken, um die JVM oder um die Implementierung von Oracle, die das JDK darstellt. Eine wichtige Änderung am Bytecode, und damit an der JVM selbst, ist ein neuer Bytecode zum Beschleunigen von Methoden, deren Signatur nicht bekannt ist. 59 1507.book Seite 60 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 In der Implementierung von Oracle gibt es zwei große Änderungen an der JVM selbst: Þ einen neuen Garbage-Collector G1 (für Garbage Frist) Þ komprimierte 64-Bit-Objekt-Pointer, sodass sie in 32 Bit Platz finden. Bei Java-Programmen mit DTrace (wie Solaris) lassen sich die Zustände erfragen und die Abarbeitung überwachen. 1.2.1 invokedynamic Seit Java vor über 10 Jahren auf dem Markt erschien, hat sich vieles geändert (und auch vieles ist gleich geblieben). Auffällig ist eine starke Zunahme von Skriptsprachen – spielten sie vor 10 Jahren kaum eine Rolle, sind sie heute unübersehbar. Möglicherweise ist ein Grund dafür, dass vor 10–20 Jahren compilierte Sprache einfach nicht die nötige Performance brachten, aber heute auch durch leistungsfähige Maschinen und intelligente Ausführung die Leistung einfach da ist. Skriptsprachen auf der JVM Eine unübersehbare Tatsache ist, dass viele Skriptsprachen heute in einer virtuellen Maschine laufen. Besondere Rolle nehmen die Java-Plattform (mit der JVM) und die .NET-Plattform mit CLR (einer virtuellen Maschine für .NET) ein. Zwei Trends zeigen sich: Zum einen werden existierende Skriptsprachen auf die JVM/CLR übertragen und zum anderen Sprachen explizit für die virtuellen Maschinen entworfen. Skriptsprache Für JVM Für CLR Python Jython IronPython Ruby JRuby IronRuby Lua Jill, Kahlua LuaCLR JavaScript Rhino IronJS PHP Quercus Tcl Jacl Groovy JavaFX Boo Tabelle 1.4: Skriptsprachen auf der JVM (Java) und CLR (.NET) 60 1507.book Seite 61 Mittwoch, 12. Oktober 2011 12:49 12 1.2 JVM-Änderungen Umsetzung der Skriptsprachen auf der JVM 1 Eine Skriptsprache, die explizit für eine VM entworfen wurde, berücksichtigt natürlich Einschränkungen. Existierende Programmiersprachen sind eine ganz andere Herausforderung, da sie Sprach- und Laufzeitkonstrukte bieten können, die auf der JVM vielleicht nicht unterstützt werden. Das ist ein Problem, und drei Strategien zur Lösung bieten sich an: Þ Ignorieren der Eigenschaften: Python ermöglicht Mehrfachvererbung, Java nicht. Daher kann das Verhalten von Python unter Java nicht perfekt nachgebildet werden, obwohl Jython sein Bestes gibt. Weiterhin kann Python Interrupts auffangen, aber so etwas gibt es unter Java nicht, also auch nicht in Jython. (Das ist aber eher eine Bibliotheks- und weniger eine Spracheigenschaft.) Þ Nachbilden der Eigenschaften: In Sprachen wie JavaScript, Python oder Ruby gibt es das so- genannte Duck Typing. Zur Laufzeit wird erst das Vorhandensein von Methoden geprüft, und die Typen müssen nicht im Quellcode stehen. In JavaScript ist zum Beispiel function add(x, y){return x + y;} oder function isEmpty(s){return s == null || s.length() == 0;} erlaubt, und erst später beim Aufruf stellt sich heraus, was x und y überhaupt ist und ob ein Plus-Operator/length()-Methode definiert ist. Deklarationen und Aufrufe dieser Art sind nur mit vielen Tricks auf der JVM umzusetzen. Þ Ändern der JVM zur Unterstützung der Eigenschaften: Die Spracheigenschaften zu ignorie- ren ist natürlich keine schöne Sache. Glücklicherweise kommt das selten vor, denn die JVM macht vieles mit. Ruby erlaubt etwa Methodennamen wie ==, <, >, +, und 1.+2 ist gültig. Die Bezeichner sind in Java zwar nicht möglich, aber die JVM hat grundsätzlich mit den Bezeichnen keine Probleme. Es ist interessant zu sehen, wie unterschiedlich Java als Sprache und die JVM sind, denn vieles in Java gibt es in der JVM gar nicht. Enums zum Beispiel sind nur einfache Klassen. Oder dass eine Klasse ohne einen vom Entwickler explizit geschriebenen Konstruktor automatisch einen Standardkonstruktor bekommt, ist nur etwas, was der Compiler generiert. Oder ein super() als ersten Aufruf im Konstruktor – alles das sind Compilereigenschaften, und von Generics ganz zu schweigen. Wenn die Besonderheiten einer Skriptsprache über Tricks und intelligentes Übersetzen in Bytecode realisiert werden können, stellt sich die Frage, ob an der JVM überhaupt Änderungen nötig sind. Wie bei vielen Diskussionen kommt dann ein Argument auf, das Änderungen oft rechtfertigt: Performance. Wenn eine Änderung in der JVM die Abarbeitung bestimmter Konstrukte massiv beschleunigt, ist das ein Grund für die Änderung. Und somit sind wir beim neuen Bytecode invokedynamic angelangt. Umsetzung von Duck Typing Reine Java-Programme werden den Bytecode invokedynamic nie benötigen, er ist einzig und allein in die JVM eingeführt worden, um Methodenaufrufe der Skriptsprachen auf der JVM zu 61 1507.book Seite 62 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 beschleunigen. Die bisherigen Bytecodes von Methodenaufrufen trugen alle nötigen Typinformationen, so wie es bei Java üblich ist. Nehmen wir: System.out.prinln( 1 ); Der Compiler macht aus dem Programm ein invokevirtual, wobei genau bei dem Aufruf steht, dass ein println() gemeint ist, was ein int annimmt. Die Typinformationen im Bytecode sind: Þ Der Empfänger ist PrintStream, und seine Methode ist println. Þ Der Parametertyp ist ein int. Þ Die »Rückgabe« ist void. Exakt diese Typen müssen vom Compiler in Bytecode gegossen werden, sonst kann die JVM den Aufruf nicht durchführen. Skriptsprachen hingegen sind da lascher. Nehmen wir noch einmal unser Beispiel aus JavaScript: function isEmpty(s) { return s == null || s.length() == 0; } Die Typen wären zwar zur Laufzeit bekannt, aber eben nicht zur Compilezeit, in der der Bytecode erstellt würde. Ein Aufruf der Methode wird schwierig, denn es fehlen ganz offensichtlich der Rückgabe- und der Parametertyp. Natürlich könnten sie über einen Trick zu Object ergänzt werden. Spielen wir kurz die Konsequenzen durch: Object isEmpty( Object s ) Das sieht gut aus. Aber jetzt wird es haarig bei length(), das keine Methode von Object ist. Das Problem kann ein Compiler auf zwei Arten lösen. Zunächst kann der Aufruf an das unbekannte Objekt, das ja zur Laufzeit üblicherweise etwas anderes als String ist, über Reflection gelöst werden. Da Reflection-Aufrufe aber nicht so performant sind wie richtige Methodenaufrufe, ist diese Lösung nicht so effizient. Eine zweite Lösung besteht in der Einführung einer Schnittstelle, die genau die fehlenden Operationen deklariert: interface I { int length(); } I isEmpty( I s ) { return s == null || s.length() == 0; } Ja, das geht – irgendwie. Das ist performanter als Reflection, aber auf diese Weise kommen eine riesige Anzahl neuer Schnittstellen bzw. Klassen in die JVM, deren Behandlung recht speicherintensiv ist. Außerdem können die Deklarationen von Methoden in Skriptsprachen auch außerhalb von Klassen vorkommen, sodass für Java ein Fake-Methoden-Empfänger erzeugt werden müsste. 62 1507.book Seite 63 Mittwoch, 12. Oktober 2011 12:49 12 1.3 Neue Pakete und Klassen invokedynamic und Hilfsklassen 1 Um die sonderbare Methodendeklaration in Java performant umzusetzen, hat der JSR-292, »Supporting Dynamically Typed Languages on the Java Platform«, den neuen Bytecode invokedynamic zusammen mit einigen Hilfsklassen im Paket java.lang.invoke definiert. Der neue Bytecode muss von einer Java 7-JVM unterstützt werden und wird von dynamischen Skriptsprachen generiert, um die Aufrufe schnell von der JVM ausführen zu lassen. Normale Entwickler werden den neuen Bytecode kaum brauchen, und im Quellcode ist er eh nicht sichtbar. Weitere Details und ein Programmbeispiel finden Leser unter http://java.sun.com/developer/ technicalArticles/DynTypeLang/. Sehr tiefe Detailinformationen liefert http://blogs.oracle. com/jrose/resource/pres/200910-VMIL.pdf. 1.3 Neue Pakete und Klassen Auf einige Neuerungen geht das Buch noch gezielter ein, etwa auf NIO.2 in Kapitel 5, »Dateien, Verzeichnisse und Dateizugriffe«, oder auf die API für nebenläufige Programmierung, das Fork-und-Join-Framework in Kapitel 2, »Threads und nebenläufige Programmierung«. Da die APIs alle bibliotheksbezogen sind und dieses Buch die Java-Bibliothek in den Mittelpunkt rückt, sind die Änderungen zu Java 7 dort vermerkt – mal ist es hier eine Methode, mal da; große Überraschungen gibt es nicht. An Typen im Paket java.lang gibt es ebenfalls kleine Änderungen. Java 7 unterstützt Unicode 6, was bedeutet, dass Java 7 Konstanten für die neuen Zeichenbereiche einführt und Methoden wie isLetter() aktualisiert hat, um auch dieses neue Zeichen korrekt zu berücksichtigen. Die Klasse Character hat für die Unicode-Blöcke Konstanten bekommen. Über den Unicode 6Standard gibt http://unicode.org/versions/Unicode6.0.0/ Auskunft. Für »normale« Entwickler ist das wenig relevant. Für die üblichen Unicode-Kodierungen gibt es in StandardCharsets Konstanten. 1.3.1 Weitere Änderungen Im GIU-Bereich, das heißt bei AWT und Swing, haben sich Kleinigkeiten geändert. Fenster können auch nicht eckig und transparent sein – das ging zwar auch schon seit einer späteren Java 6-Version, aber nur inoffiziell – das heißt, mit keiner Klasse im »erlaubten« Paket. Zwar war ein Datumsauswahldialog für Java 7 in Planung, aber er verschiebt sich wohl noch bis Java 8. 63 1507.book Seite 64 Mittwoch, 12. Oktober 2011 12:49 12 1 Neues in Java 7 Neuerungen in Kürze: Þ Alle Wrapper-Klassen bieten eine statische compare()-Methode, die zwei primitive Werte vergleicht. Die Methode ist eine Alternative zur compareTo()-Methode, die alle WrapperKlassen bieten, die Comparable implementieren. Þ Der ProcessBuilder ist eine Klasse in Java, um externe Prozesse aufzubauen. Neu sind Methoden, um die Datenströme umzuleiten. Þ Klassenlader lassen sich mit close() wieder schließen. Þ kleine Änderungen an den Kalender-Klassen Þ Unterstützung für SCTP (Stream Control Transmission Protocol) und SDP (Sockets Direct Protocol). Das Tutorial gibt unter http://download.oracle.com/javase/tutorial/sdp/sockets/ eine Einführung in die sehr spezielle Technologie. Þ neue Klassen für asynchrone Datei- und Socket-Operationen Þ Neu in Java 7 ist JDBC 4.1, was nicht nur auf AutoCloseable eingeht, sondern auch Standard- Implementierungen für sogenannte Row-Sets mitbringt. Weiterhin können die JDBC-Klassen Pseudo-Spalten nutzen, und bei einer Connection lässt sich das Datenbank-Schema erfragen und setzen. 64 1507.book Seite 1227 Mittwoch, 12. Oktober 2011 12:49 12 Kapitel 18 Reflection und Annotationen »Aber wofür soll das gut sein?« – Advanced Computing Systems Division von IBM zum Microchip, 1968 Das Reflection-Modell erlaubt es uns, Klassen und Objekte, die zur Laufzeit von der JVM im Speicher gehalten werden, zu untersuchen und in begrenztem Umfang zu modifizieren. Das Konzept der Reflection (oder auch Introspektion) ist besonders bei JavaBeans oder Hilfsprogrammen zum Debuggen oder bei GUI-Buildern interessant. Diese Programme heißen auch Metaprogramme, da sie auf den Klassen und Objekten anderer Programme operieren. Reflection fällt daher auch in die Schlagwortkategorie »Meta-Programming«. 18.1 Metadaten Ein Metadatum ist eine Information über eine Information. In Java beschreibt ein ClassObjekt, was Typen wie Klassen so »können«, also welche Konstruktoren und Methoden sie haben, welche Attribute sie besitzen und wie die Erweiterungsbeziehungen sind. 18.1.1 Metadaten durch JavaDoc-Tags Seit den ersten Java-Versionen gibt es die JavaDoc-Tags, die besondere Metadaten darstellen. So ist im folgenden Beispiel die Methode veraltet, weil das JavaDoc-Tag @deprecated gesetzt ist: /** * Sets the day of the month of this <tt>Date</tt>object to the specified value. .... * @deprecated As of JDK version 1.1, replaced by .... */ @Deprecated public void setDate( int date ) { getCalendarDate().setDayOfMonth( date ); } 1227 18 1507.book Seite 1228 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen In diesem Fall gilt das JavaDoc-Tag für genau eine Methode, die dann als annotiert gilt. Die Beschreibungen können aber noch weiter gehen und müssen nicht nur auf Methodenebene bleiben. So annotiert das Tag @author den Autor und damit gleich eine ganze Klasse oder Schnittstelle. Um die in Kommentaren eingesetzten JavaDoc-Tags muss sich der Java-Compiler nicht kümmern, obwohl er @deprecated eine Ausnahme zugesteht. Es ist Aufgabe des externen Programms javadoc – eines sogenannten Doclets –, aus diesen Kommentaren etwas zu machen, etwa eine Sammlung von verknüpften HTML-Dokumenten. 18.2 Metadaten der Klassen mit dem Class-Objekt Angenommen, wir wollen einen Klassen-Browser schreiben. Dieser soll alle zum laufenden Programm gehörenden Klassen und darüber hinaus weitere Informationen anzeigen, wie etwa Variablenbelegung, deklarierte Methoden, Konstruktoren und Informationen über die Vererbungshierarchie. Dafür benötigen wir die Bibliotheksklasse Class. Exemplare der Klasse Class sind Objekte, die entweder eine Java-Klasse oder Java-Schnittstelle repräsentieren (dass auch Schnittstellen durch Class-Objekte repräsentiert werden, wird im Folgenden nicht mehr ausführlich unterschieden). In diesem Punkt unterscheidet sich Java von vielen herkömmlichen Programmiersprachen, da sich Eigenschaften von Klassen vom gerade laufenden Programm mittels der Class-Objekte abfragen lassen. Bei den Exemplaren von Class handelt es sich um eine eingeschränkte Form von Meta-Objekten1 – die Beschreibung einer Java-Klasse, die aber nur ausgewählte Informationen preisgibt. Neben normalen Klassen werden auch Schnittstellen durch je ein Class-Objekt repräsentiert. 18.2.1 An ein Class-Objekt kommen Zunächst müssen wir für eine bestimmte Klasse das zugehörige Class-Objekt in Erfahrung bringen. Class-Objekte selbst kann nur die JVM erzeugen. Wir können das nicht (die Objekte sind immutable, und der Konstruktor ist privat).2 Um einen Verweis auf ein Class-Objekt zu bekommen, bieten sich folgende Lösungen an: 1 Echte Metaklassen wären Klassen, deren jeweils einziges Exemplar die normale Java-Klasse ist. Dann wären etwa die normalen Klassenvariablen in Wahrheit Objektvariablen in der Metaklasse. 2 Und der JavaDoc lautet: »Constructor. Only the Java Virtual Machine creates Class objects.« 1228 1507.book Seite 1229 Mittwoch, 12. Oktober 2011 12:49 12 18.2 Metadaten der Klassen mit dem Class-Objekt Þ Ist ein Exemplar der Klasse verfügbar, rufen wir die getClass()-Methode des Objekts auf und erhalten das Class-Exemplar der zugehörigen Klasse. Þ Jede Klasse enthält eine Klassenvariable mit dem Namen .class vom Typ Class, die auf das zugehörige Class-Exemplar verweist. Þ Auch auf primitiven Datentypen ist das Ende .class erlaubt. Das gleiche Class-Objekt lie- fert die statische Variable TYPE der Wrapper-Klassen. Damit ist int.class == Integer.TYPE. Þ Die Klassenmethode Class.forName(String) kann eine Klasse erfragen, und wir erhalten das zugehörige Class-Exemplar als Ergebnis. Ist die Klasse noch nicht geladen, sucht und bindet forName() die Klasse ein. Weil das Suchen schiefgehen kann, ist eine ClassNotFoundException möglich. Þ Haben wir bereits ein Class-Objekt, sind aber nicht an ihm, sondern an seinen Vorfahren interessiert, so können wir einfach mit getSuperclass() ein Class-Objekt für die Oberklasse erhalten. Das folgende Beispiel zeigt drei Möglichkeiten auf, um an ein Class-Objekt für java.util.Date heranzukommen: Listing 18.1: com/tutego/insel/meta/GetClassObject.java, main() Class<Date> c1 = java.util.Date.class; System.out.println( c1 ); // class java.util.Date Class<?> c2 = new java.util.Date().getClass(); // oder Class<? extends Date> c2 = ... 18 System.out.println( c2 ); // class java.util.Date try { Class<?> c3 = Class.forName( "java.util.Date" ); System.out.println( c3 ); // class java.util.Date } catch ( ClassNotFoundException e ) { e.printStackTrace(); } Die Variante mit forName() ist sinnvoll, wenn der Klassenname bei der Übersetzung des Programms noch nicht feststand. Sonst ist die vorhergehende Technik eingängiger, und der Compiler kann prüfen, ob es den Typ gibt. Beispiel Klassenobjekte für primitive Elemente liefert forName() nicht! Die beiden Anweisungen Class.forName("boolean") und Class.forName(boolean.class.getName()) führen zu einer ClassNotFoundException. 1229 1507.book Seite 1230 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen class java.lang.Object Þ final Class<? extends Object> getClass() Liefert zur Laufzeit das Class-Exemplar, das die Klasse des Objekts repräsentiert. final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ static Class<?> forName(String className) throws ClassNotFoundException Liefert das Class-Exemplar für die Klasse oder Schnittstelle mit dem angegebenen voll qualifizierten Namen. Falls sie bisher noch nicht vom Programm benötigt wurde, sucht und lädt der Klassenlader die Klasse. Die Methode liefert niemals null zurück. Falls die Klasse nicht geladen und eingebunden werden konnte, gibt es eine ClassNotFoundException. Eine alternative Methode forName() ermöglicht auch das Laden mit einem gewünschten Klassenlader. Der Klassenname muss immer voll qualifiziert sein. ClassNotFoundException und NoClassDefFoundError * Eine ClassNotFoundException lösen die Methoden forName() aus Class und loadClass() bzw. findSystemClass() aus ClassLoader immer dann aus, wenn der Klassenlader die Klasse nach ihrem Klassennamen nicht finden kann. Neben der Exception-Klasse gibt es ein NoClassDefFoundError – ein harter LinkageError, den das System immer dann auslöst, wenn die JVM eine im Bytecode referenzierte Klasse nicht laden kann. Nehmen wir zum Beispiel eine Anweisung wie new MeineKlasse(). Führt die JVM diese Anweisung aus, versucht sie den Bytecode von MeineKlasse zu laden. Ist der Bytecode für MeineKlasse nach dem Compilieren entfernt worden, löst die JVM durch den nicht geglückten Ladeversuch den NoClassDefFoundError aus. Auch tritt der Fehler auf, wenn beim Laden des Bytecodes die Klasse MeineKlasse zwar gefunden wurde, aber MeineKlasse einen statischen Initialisierungsblock besitzt, der wiederum eine Klasse referenziert, für die keine Klassendatei vorhanden ist. Während ClassNotFoundException häufiger vorkommt als NoClassDefFoundError, ist es im Allgemeinen ein Indiz dafür, dass ein Java-Archiv im Klassenpfad fehlt. Umbenennungen der Klassennamen durch den Obfuscator Dass der Compiler automatisch Bytecode gemäß dieses veränderten Quellcodes erzeugt, führt nur dann zu unerwarteten Problemen, wenn wir einen Obfuscator über den Programmtext laufen lassen, der nachträglich den Bytecode modifiziert und damit die Bedeutung des Programms beziehungsweise des Bytecodes verschleiert und dabei Klassen umbenennt. Offensichtlich darf ein Obfuscator Klassen, deren Class-Exemplare abgefragt werden, nicht umbe- 1230 1507.book Seite 1231 Mittwoch, 12. Oktober 2011 12:49 12 18.2 Metadaten der Klassen mit dem Class-Objekt nennen; oder der Obfuscator müsste die entsprechenden Zeichenketten ebenfalls korrekt ersetzen (aber natürlich nicht alle Zeichenketten, die zufällig mit Namen von Klassen übereinstimmen). 18.2.2 Was das Class-Objekt beschreibt * Ein Class-Exemplar kann eine Schnittstelle, eine Klasse, einen primitiven Datentyp oder auch einen Array-Typ beschreiben. Dies lässt sich durch die drei Methoden isInterface(), isPrimitive() und isArray() herausfinden. Wenn keine der drei Methoden für ein Class-Exemplar true liefert, repräsentiert das Objekt eine gewöhnliche Klasse. Dass es auch Class-Exemplare gibt, die die primitiven Datentypen von Java beschreiben, erstaunt zunächst. Damit ist es jedoch möglich, die Parameter- und Ergebnistypen beliebiger Java-Methoden einheitlich durch Class-Exemplare zu beschreiben. Dazu kodieren jede der acht Wrapper-Klassen, die zu den Datentypen boolean, byte, char, short, int, long, float und double gehören, und die spezielle Klasse für den Typ void eine Konstante TYPE. Benötigen wir ein Class-Objekt für den primitiven Typ int, so greifen wir mit Integer.TYPE (oder alternativ mit int.class) darauf zu. Alle Class-Exemplare für primitive Datentypen werden automatisch von der JVM erzeugt. Die Methode isPrimitive() gibt genau für diese neun besonderen ClassExemplare true zurück, sodass sie von Repräsentanten für echte Klassen unterschieden werden können. Hinweis 18 Obwohl void kein Typ ist, meldet isPrimitive() dies: System.out.println( void.class.isPrimitive() ); // true Das folgende Programmstück testet die Attribute von Class-Objekten systematisch durch. Wir benutzen die Methode getName(), um den Namen des Class-Objekts auszugeben. Im nächsten Unterkapitel mehr dazu. Das Class-Objekt für Felder setzt sich aus dem Basistyp und Paaren von eckigen Klammern zusammen, etwa double[][].class. Listing 18.2: com/tutego/insel/meta/CheckClassType.java, CheckClassType class CheckClassType { public static void main( String[] args ) { checkClassType( Observer.class ); checkClassType( Observable.class ); checkClassType( (new int[2][3][4]).getClass() ); 1231 1507.book Seite 1232 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen checkClassType( Integer.TYPE ); } static void checkClassType( Class<?> c ) { if ( c.isArray() ) System.out.println( c.getName() + " ist ein Feld." ); else if ( c.isPrimitive() ) System.out.println( c + " ist ein primitiver Typ."); else if ( c.isInterface() ) System.out.println( c.getName() + " ist ein Interface." ); else System.out.println( c.getName() + " ist eine Klasse." ); } } Die Ausgabe des Programms ist nun: java.util.Observer ist ein Interface. java.util.Observable ist eine Klasse. [[[I ist ein Feld. int ist ein primitiver Typ. final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ boolean isInterface() Liefert true, wenn das Class-Objekt eine Schnittstelle beschreibt. Þ boolean isArray() Liefert true, wenn das Class-Objekt einen Array-Typ beschreibt. Þ boolean isPrimitive() Testet, ob das Class-Objekt einen primitiven Datentyp beschreibt. Komponententyp bei Feldern Die Methode getComponentType() liefert bei Feldern den Typ der Elemente als Class-Objekt. Steht das Class-Objekt für kein Feld, ist die Methodenrückgabe null. 1232 1507.book Seite 1233 Mittwoch, 12. Oktober 2011 12:49 12 18.2 System.out.println( double[].class.getComponentType() ); Metadaten der Klassen mit dem Class-Objekt // double System.out.println( double[][].class.getComponentType() ); // class [D System.out.println( double.class.getComponentType() ); 18.2.3 // null Der Name der Klasse Liegt zu einer Klasse das Class-Objekt vor, so können wir zur Laufzeit ihren voll qualifizierten Namen über die Methode getName() ausgeben. Da jeder Typ über einen Namen verfügt, führt diese Methode also jedes Mal zum Ziel: Listing 18.3: SampleName.java String n1 = new java.util.Date().getClass().getName(); System.out.println( n1 ); // java.util.Date String n2 = java.util.RandomAccess.class.getName(); System.out.println( n2 ); // java.util.RandomAccess String n3 = Deprecated.class.getName(); System.out.println( n3 ); // java.lang.Deprecated String n4 = Thread.State.class.getName(); System.out.println( n4 ); // java.lang.Thread$State Kodierung von Feldern * Schwieriger ist die Kodierung bei Array-Typen, die ja eine besondere Form von Klassen sind. getName() kodiert sie mit einer führenden »[«. Jede Klammer steht dabei für eine Dimension des Array-Typs. Nach den Klammern folgt in einer kodierten Form der Typ der Array-Elemente. So liefert System.out.println( int[][][].class.getName() ); // [[[I System.out.println( (new int[2][3][4]).getClass().getName() ); // [[[I den String »[[[I«, also einen dreidimensionalen Array-Typ mit Array-Elementen vom primitiven Typ int. Der Elementtyp ist wie folgt kodiert: Kürzel Datentyp B Byte C Char D Double Tabelle 18.1: Kodierung der Elementtypen 1233 18 1507.book Seite 1234 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Kürzel Datentyp F Float I Int J Long LElementtyp; Klasse oder Schnittstelle S Short Z Boolean Tabelle 18.1: Kodierung der Elementtypen (Forts.) Nimmt das Array Objektreferenzen auf, wird deren Typ in der Form »LKlassenname;« kodiert. So liefert (new Object[3]).getClass().getName() den String [Ljava.lang.Object;. Der Klassenbeziehungsweise Schnittstellenname ist wie üblich voll qualifiziert. Der String ist auch für Class.forName() von Bedeutung. Im Fall von Arrays liefert die Methode ein Class-Objekt für den Elementtyp. Die ersten Versuche, ein Class-Objekt für Felder zu beziehen, scheitern an einer ClassNotFoundException: Class.forName( "String[]" ); Class.forName( "java.lang.String[]" ); In der ersten Anweisung ist der Klassenname nicht voll qualifiziert, und auch in der zweiten Anweisung ist der String falsch aufgebaut. out.println( Class.forName("[Ljava.lang.String;") ); // class [Ljava.lang.String; Steht die Frage an, ob ein Class-Objekt für ein Feld von Objekten steht oder für ein primitives Feld, lässt sich das Ergebnis von getName() auswerten: public static boolean isObjectArray( Class clazz ) { if ( clazz != null && clazz.isArray() ) return clazz.getName().startsWith( "[L" ); return false; } So liefert: System.out.println( isObjectArray( Object[].class ) ); // true System.out.println( isObjectArray( int[].class ) ); // false System.out.println( isObjectArray( Object.class ) ); // false 1234 1507.book Seite 1235 Mittwoch, 12. Oktober 2011 12:49 12 18.2 Metadaten der Klassen mit dem Class-Objekt toString() Auch eine zweite Methode ist uns bekannt, um Class-Exemplare für Menschen lesbar auszugeben: die Methode toString(). Sie basiert im Kern auf getName(), fügt aber zusätzlich die Art der repräsentierten Klasse (normale Klasse, Schnittstelle oder primitiver Datentyp) ein: public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); } final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ String getName() Liefert für ein Class-Exemplar als String den voll qualifizierten Namen der repräsentierten Klasse oder Schnittstelle beziehungsweise des repräsentierten Array-Typs oder des primitiven Datentyps. Þ String toString() Liefert eine für Menschen lesbare String-Repräsentation des Class-Objekts. 18.2.4 instanceof mit Class-Objekten * Der binäre Operator instanceof testet, ob ein Objekt Exemplar einer Klasse oder der Oberklasse ist. Wenn das Ergebnis wahr ist, lässt sich das Objekt unter dem gegebenen Typ ansprechen, ist also zuweisungskompatibel. Der rechte Operator bei instanceof, der Typname, muss jedoch immer zur Übersetzungszeit bekannt sein und kann nicht dynamisch, etwa durch einen String, festgelegt werden. Ist der Typname zur Compilierzeit vielleicht unbekannt, kann das Class-Objekt helfen. Die Methode isInstance(Object) ist sozusagen ein dynamisches instanceof. Gilt mit dem Operator object instanceof ReferenceType so heißt das mit der Methode: ReferenceType-Class-Objekt.isInstance( object ) Gewöhnungsbedürftig ist sicherlich die Tatsache, dass bei der Methode isInstance() die beiden Operanden umgedreht sind. Dazu ein paar Beispiele: 1235 18 1507.book Seite 1236 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Listing 18.4: IsAssignableFrom.java, main() Component b = new JLabel(); out.println( b instanceof JLabel ); // true out.println( JLabel.class.isInstance( b ) ); // true out.println( Object.class.isInstance( b ) ); // true out.println( Class.forName("java.awt.Component").isInstance( b ) ); // true out.println( String.class.isInstance( b ) ); // false Die Methode isInstance(object) ist natürlich ein wenig dadurch eingeschränkt, dass es immer ein Test-Objekt geben muss. Die Frage etwa, ob das Class-Objekt der Schnittstelle PublicKey eine »Ist-eine-Art-von-Serializable« ist, kann isInstance(object) nicht beantworten, denn dann müsste es vorher ein Objekt geben. Für diesen Fall bietet das Class-Objekt noch eine zweite Methode, isAssignableFrom(Class): Class<?> clazz = Serializable.class; out.println( clazz.isAssignableFrom( String.class ) ); // true out.println( clazz.isAssignableFrom( Thread.class ) ); // false out.println( clazz.isAssignableFrom( PublicKey.class ) ); // true Solange der Typname zur Übersetzungszeit bekannt ist, ist instanceof immer noch die beste Lösung. Doch wenn die Klasse nur durch ein Class-Objekt gegeben ist, bleibt immer noch isAssignableFrom(). Die Methode clazz.isInstance(obj) ist sozusagen eine Kurzform von clazz.isAssignableFrom(obj.getClass()). 18.2.5 Oberklassen finden * Das Class-Exemplar für eine Klasse gibt Zugriff auf die Oberklasse, die Sichtbarkeitsstufe und weitere Informationen. Die Oberklasse ermittelt getSuperclass(). Die Methode gibt null zurück, falls das Class-Objekt eine Schnittstelle repräsentiert oder wir schon am oberen Ende der Hierarchie sind, also bei dem Class-Objekt für die Wurzelklasse Object. Das folgende Programm findet alle Oberklassen einer Klasse durch den wiederholten Aufruf der Methode getSuperclass(): Listing 18.5: com/tutego/insel/meta/ShowSuperclasses.java Class<?> subclass = javax.swing.JButton.class; Class<?> superclass = subclass.getSuperclass(); while ( superclass != null ) { String className = superclass.getName(); 1236 1507.book Seite 1237 Mittwoch, 12. Oktober 2011 12:49 12 18.2 Metadaten der Klassen mit dem Class-Objekt System.out.println( className ); subclass = superclass; superclass = subclass.getSuperclass(); } Wahrscheinlich wäre eine rekursive Variante noch eleganter, aber darauf kommt es jetzt nicht an. javax.swing.AbstractButton javax.swing.JComponent java.awt.Container java.awt.Component java.lang.Object final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ Class<? super T> getSuperclass() Liefert ein Class-Exemplar für die Oberklasse der Klasse, die durch das aufrufende Class-Objekt repräsentiert wird. Falls wir schon oben auf der Vererbungshierarchie bei Object sind oder nach der Oberklasse einer Schnittstelle fragen, liefert die Methode null. 18.2.6 Implementierte Interfaces einer Klasse oder eines Interfaces * Klassen stehen zum einen in einer Vererbungsbeziehung zu einer Oberklasse und können zum anderen mehrere Schnittstellen implementieren. Schnittstellen können ihrerseits wiederum andere Schnittstellen erweitern. Bei einer Klassendeklaration folgt direkt hinter dem Schlüsselwort implements eine Auflistung der implementierten Schnittstellen. So implementiert die Klasse RandomAccessFile die Schnittstellen DataOutput, DataInput und Closeable: public class RandomAccessFile implements DataOutput, DataInput, Closeable Um zu einem vorhandenen Class-Objekt die Schnittstellen aufzulisten, rufen wir getInterfaces() auf, die uns ein Array von Class-Objekten liefert. Von hier aus kennen wir den Weg zum Namen: Der Aufruf von getName() liefert den String für den Namen der Schnittstelle. Beispiel Gib die implementierten Schnittstellen von RandomAccessFile aus: Listing 18.6: com/tutego/insel/meta/ShowInterfaces.java, main() for ( Class<?> theInterface: java.io.RandomAccessFile.class.getInterfaces() ) System.out.println( theInterface.getName() ); 1237 18 1507.book Seite 1238 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Beispiel (Forts.) Die Ausgabe ist: java.io.DataOutput java.io.DataInput java.io.Closeable 18.2.7 Modifizierer und die Klasse Modifier * Eine Klassendeklaration kann Modifizierer enthalten, also Schlüsselwörter, die zum Beispiel die Sichtbarkeit bestimmen. Unter anderem sind dies public, protected, private und final. Sie stehen etwa in der Klassendeklaration vor dem Schlüsselwort class oder auch vor Methoden. Die Modifizierer können auch kombiniert werden: So ist die Klasse Class selbst public final. Die Methode getModifiers() liefert im Rückgabewert die Modifizierer, verschlüsselt als Ganzzahl: System.out.println( Modifier.class.getModifiers() ); // 1 System.out.println( Modifier.toString(Modifier.class.getModifiers()) ); // public final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ int getModifiers() Liefert die Modifizierer für eine Klasse oder eine Schnittstelle. Dekodieren der Zahlrepräsentationen durch die Klasse Modifier Damit wir uns bei der Entschlüsselung nicht mit magischen Zahlenwerten der JVM herumschlagen müssen, gibt es in der Klasse java.lang.reflect.Modifier einige statische Methoden, die diese Ganzzahl testen und aufbauen. Zudem werden Konstanten deklariert (wie Modifier.PUBLIC), mit denen dieser Integerwert verglichen werden kann. Da die Ganzzahl potenziell eine Kombination mehrerer Modifizierer kodiert, ist die gezielte Abfrage allerdings mit den statischen isXXX()-Methoden einfacher. Obwohl eine Klasse nicht transient, synchronized, nativ sein kann, listen wir hier alle statischen Methoden auf, da wir diese Modifizierer später auch für die Untersuchung von Methoden und Objekt- beziehungsweise Klassenvariablen per Reflection einsetzen. Jede dieser Testmethoden liefert true, wenn der gefragte Modifizierer in dem kodierten Ganzzahlwert enthalten ist. Alle Methoden sind static und liefern ein booleanErgebnis, außer toString(). 1238 1507.book Seite 1239 Mittwoch, 12. Oktober 2011 12:49 12 18.2 Metadaten der Klassen mit dem Class-Objekt class java.lang.reflect.Modifier Þ static boolean isAbstract(int mod) Þ static boolean isFinal(int mod) Þ static boolean isInterface(int mod) Þ static boolean isNative(int mod) Þ static boolean isPrivate(int mod) Þ static boolean isProtected(int mod) Þ static boolean isPublic(int mod) Þ static boolean isStatic(int mod) Þ static boolean isSynchronized(int mod) Þ static boolean isTransient(int mod) Þ static boolean isVolatile(int mod) Betrachten wir die toString()-Methode der Klasse Modifier. Dort finden wir eine Liste aller möglichen Modifizierer mit den Konstanten: public static String toString( int mod ) { StringBuffer sb = new StringBuffer(); int len; if ((mod & PUBLIC) != 0) sb.append("public "); 18 if ((mod & PRIVATE) != 0) sb.append("private "); if ((mod & PROTECTED) != 0) sb.append("protected "); /* Canonical order */ if ((mod & ABSTRACT) != 0) sb.append("abstract "); if ((mod & STATIC) != 0) sb.append("static "); if ((mod & FINAL) != 0) sb.append("final "); if ((mod & TRANSIENT) != 0) sb.append("transient "); if ((mod & VOLATILE) != 0) sb.append("volatile "); if ((mod & NATIVE) != 0) sb.append("native "); if ((mod & SYNCHRONIZED) != 0) sb.append("synchronized "); if ((mod & INTERFACE) != 0) sb.append("interface "); if ((len = sb.length()) > 0)/* trim trailing space */ return sb.toString().substring(0, len-1); return ""; } 1239 1507.book Seite 1240 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Des Weiteren gibt es seit Java 7 xxxModifier()-Methoden, die über ein int aussagen, welche Modifizierer an einem bestimmten Element erlaubt sind: class java.lang.reflect.Modifier Þ static int classModifiers() Þ static int constructorModifiers() Þ static int fieldModifiers() Þ static int interfaceModifiers() Þ static int methodModifiers() Liefert ein int, das alle Modifizierer kodiert, die an Klassen/Konstruktoren/Feldern/Schnittstellen/Methoden erlaubt sind. So liefert constructorModifiers() zum Beispiel Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE. Hinweis Schnittstellen, wie java.io.Serializable, tragen den Modifier abstract. int modifier = Serializable.class.getModifiers(); out.println( modifier ); // 1537 out.println( Modifier.toString(modifier) ); // public abstract interface 18.2.8 Die Arbeit auf dem Feld * Die Utility-Klasse java.lang.reflect.Array stellt statische Methoden bereit, um auf Array-Objekten generisch zu arbeiten. Elemente lassen sich erfragen und setzen und auch Arrays mit einem gewünschten Typ anlegen: Object array = Array.newInstance( int.class, 20 ); System.out.println( Array.getLength(array) ); // 20 Array.setInt( array, 0, –1 ); System.out.println( Array.getInt(array, 0) ); // –1 Bei newInstance() ist der Typ int.class und nicht int[].class! Eine allgemeine statische Array-Methode set() und get() arbeitet für Objekte, wobei auch Wrapper für primitive Felder verwendet werden können: Array.set( array, 0, Integer.valueOf(-1) ); System.out.println( Array.get(array, 0) ); 1240 // –1 1507.book Seite 1241 Mittwoch, 12. Oktober 2011 12:49 12 18.3 Attribute, Methoden und Konstruktoren Für mehrdimensionale Felder lässt sich bei newInstance() ein Feld von Größen angeben: Object array = Array.newInstance( int.class, new int[]{ 2, 2 } ); ((int[][])array)[0][0] = 1; ((int[][])array)[1][1] = 1; System.out.println( Arrays.deepToString( (int[][])array ) ); // [[1, 0], [0, 1]] 18.3 Attribute, Methoden und Konstruktoren Ein Class-Objekt bietet nicht nur Zugriff auf Oberklassen, Sichtbarkeiten, Modifizierer und Schnittstellen, sondern natürlich auch auf die Variablen, Methoden und Konstruktoren einer Klasse oder Schnittstelle. Daher kooperiert Class mit fünf weiteren Typen: Þ Constructor: Steht für die Konstruktoren einer Klasse. So gibt zum Beispiel getConstruc- tors() ein Feld von Konstruktoren zurück. Þ Field: Ermöglicht den Zugriff auf die Objekt- und Klassenvariablen, um später Belegungen lesen und Werte verändern zu können. Þ Method: Steht für die Methoden einer Klasse beziehungsweise Operationen der Schnittstel- len. So liefert getDeclaredMethods() die Methoden, die dann später mit invoke() aufgerufen werden können. Þ Annotation: Repräsentiert die Annotationen, die an der Klasse/Schnittstelle festgemacht sind. So liefert zum Beispiel die Class-Methode getAnnotations() die festgemachten Annotationen. Þ Package: getPackage() liefert ein Package-Objekt für die Klasse, die eine Versionsnummer be- inhaltet, wenn diese im Manifest gesetzt wurde. Weiterhin gibt es folgende allgemeine Implementierungsbeziehungen: Þ Die Klassen Class, Method, Field und Constructor implementieren eine Schnittstelle Member, um etwa den Namen, die Modifizierer oder die deklarierende Klasse zu erfragen. Þ Die Klassen Class, Constructor und Method implementieren die Schnittstelle GenericDeclara- tion, da sie generische Typvariablen deklarieren können. Þ Die Klassen Constructor, Field und Method implementieren AccessibleObject, um die Sicht- barkeit auszuschalten. Þ Class, Constructor, Field, Method und Package implementieren AnnotatedElement, weil sie An- notationen tragen können. 1241 18 1507.book Seite 1242 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Reflections-Exceptions und ReflectiveOperationException Ist etwas so dynamisch wie Reflection, kann eine Menge schiefgehen. Nahezu alle Methoden zum Zugriff auf Laufzeitinformationen lösen daher die eine oder andere Ausnahme aus. An dieser Stelle sollen die zentralen Ausnahmen kurz vorgestellt werden. Alle stammen aus dem Paket java.lang: Þ NoSuchFieldException und NoSuchMethodException: Das Attribut oder die Methode wird er- fragt, aber existiert nicht. Þ ClassNotFoundException: Der Klassenlader versucht, die Klasse zu laden, konnte sie aber nicht bekommen. Wird ausgelöst etwa von Class.forName(String). Þ InstantiationException: Der Versuch, ein Exemplar aufzubauen, scheitert, etwa wenn ver- sucht wird, eine abstrakte Klasse zu instanziieren oder den Standardkonstruktor aufzurufen, die Klasse aber nur parametrisierte Konstruktoren deklariert. Þ IllegalAccessException: Die Sichtbarkeit ist zum Beispiel private, sodass von außen ein At- tribut nicht erfragt, eine Methode nicht aufgerufen oder ein Exemplar nicht aufgebaut werden kann. Þ InvocationTargetException: Eine Methode oder ein Konstruktor können eine Exception aus- lösen. Die InvocationTargetException packt diese Exception ein. java.lang.Exception java.lang.ReflectiveOperationException + + + + ReflectiveOperationException() ReflectiveOperationException(message: String) ReflectiveOperationException(message: String, cause: Throwable) ReflectiveOperationException(cause: Throwable) java.lang.ClassNotFoundException java.lang.reflect.InvocationTargetException java.lang.NoSuchMethodException java.lang.IllegalAccessException java.lang.NoSuchFieldException java.lang.InstantiationException Abbildung 18.1: UML-Diagramm für ReflectiveOperationException Einige Methoden lösen weniger Ausnahmen im Fehlerfall aus, einige mehr. newInstance() führt gleich vier Ausnahmen am throws auf. Oftmals führt das zu großen catch-Blöcken mit dupliziertem Code. Ab Java 7 gibt es daher für die sechs Ausnahmen eine Oberklasse ReflectiveOperationException, sodass bei identischer Behandlung alles vom Typ ReflectiveOperationException gecatcht werden kann: 1242 1507.book Seite 1243 Mittwoch, 12. Oktober 2011 12:49 12 18.3 Attribute, Methoden und Konstruktoren Þ ClassNotFoundException extends ReflectiveOperationException Þ IllegalAccessException extends ReflectiveOperationException Þ InstantiationException extends ReflectiveOperationException Þ InvocationTargetException extends ReflectiveOperationException Þ NoSuchFieldException extends ReflectiveOperationException Þ NoSuchMethodException extends ReflectiveOperationException ReflectiveOperationException selbst ist eine Unterklasse von Exception und nicht von RuntimeException. Sie muss daher explizit behandelt werden, genauso wie die anderen Ausnahmen vorher. 18.3.1 Reflections – Gespür für die Attribute einer Klasse Besonders bei Klassen-Browsern oder GUI-Buildern ist es interessant, auf die Variablen eines Objekts zuzugreifen, das heißt, ihre Werte auszulesen und zu verändern. Damit wir an beschreibende Objekte für die in einer Klasse deklarierten beziehungsweise aus Oberklassen geerbten Variablen gelangen, rufen wir die Methode getFields() für das Class-Objekt der Klasse auf, die uns interessiert. Als Ergebnis erhalten wir ein Array von Field-Objekten. Jeder ArrayEintrag beschreibt eine Objekt- oder Klassenvariable, auf die wir zugreifen dürfen. Nur auf öffentliche, also public-Elemente, haben wir per (gewöhnlicher) Reflection Zugriff (auf eine privilegierte Reflection gehen wir hier nicht ein). Schnittstellen deklarieren ja bekanntlich nur Konstanten. Somit ist der schreibende Zugriff, den wir später näher betrachten wollen, nur auf in Klassen deklarierte Variablen beschränkt. Lesen ist natürlich bei Konstanten und Variablen gleichermaßen erlaubt. Beim Zugriff auf die Attribute mittels getFields() müssen wir aufpassen, dass wir uns keine SecurityException einfangen. Das kann uns aber bei vielen Methoden passieren, und weil SecurityException eine RuntimeException ist, muss sie auch nicht extra aufgefangen werden. In der Dokumentation ist sie daher nicht angegeben. Um für SimpleDateFormat alle Objekt- und Klassenvariablen mit ihren Datentypen herauszufinden, lassen wir eine Schleife über das Field-Array laufen. Die Namen der Variablen finden sich leicht mit getName(). Wir haben aber den zugehörigen Datentyp noch nicht. Dazu müssen wir erst mit getType() ein Class-Objekt für den Typ ermitteln, und dann liefert uns getName() eine String-Repräsentation des Typs: Listing 18.7: com/tutego/insel/meta/ShowFields.java, main() Class<?> c = java.text.SimpleDateFormat.class; System.out.println( "class " + c.getName() + " {" ); for ( Field publicField : c.getFields() ) { String fieldName = publicField.getName(); 1243 18 1507.book Seite 1244 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen String fieldType = publicField.getType().getName(); System.out.printf( " %s %s;%n", fieldType, fieldName ); } System.out.println( "}" ); Dies ergibt die (gekürzte) Ausgabe: class java.text.SimpleDateFormat { int ERA_FIELD; int YEAR_FIELD; ... int SHORT; int DEFAULT; } final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ Field[] getFields() Liefert ein Array mit Field-Objekten. Die Einträge sind unsortiert. Das Array hat die Länge 0, wenn die Klasse beziehungsweise Schnittstelle keine öffentlichen Variablen deklariert oder erbt. getFields() liefert automatisch auch Einträge für die aus Oberklassen beziehungsweise Schnittstellen geerbten öffentlichen Variablen. Þ Field getField(String name) throws NoSuchFieldException Erfragt ein bestimmtes Feld. Die Klasse Field implementiert im Übrigen das Interface Member und ist eine Erweiterung von AccessibleObject. AccessibleObject ist die Basisklasse für Field-, Method- und Constructor-Objekte. Auch Method und Constructor implementieren das Interface Member, das zur Identifikation über getName() oder getModifiers() dient. Zusätzlich liefert getDeclaringClass() das ClassObjekt, das tatsächlich eine Variable oder Methode deklariert. Da geerbte Elemente in der Aufzählung mit auftauchen, ist dies der einzige Weg, um die Position der Deklaration in der Vererbungshierarchie exakt zu bestimmen. Mit dem Field-Objekt können wir vieles erfragen: den Namen des Attributs, den Datentyp und auch wieder die deklarierten Modifizierer. Werfen wir einen Blick auf die toString()Methode der Klasse Field: public String toString() { int mod = getModifiers(); return (((mod == 0) ? "" : (Modifier.toString(mod) + " ")) + getTypeName(getType()) + " " 1244 1507.book Seite 1245 Mittwoch, 12. Oktober 2011 12:49 12 18.3 Attribute, Methoden und Konstruktoren + getTypeName(getDeclaringClass()) + "." + getName()); } Beispiel Für die Schleife über die Field-Objekte von SimpleDateFormat und einen Aufruf von toString() liefern die Zeilen for ( Field publicField : c.getFields() ) System.out.println( " " + publicFields ); dann: class java.text.SimpleDateFormat { public static final int java.text.DateFormat.ERA_FIELD public static final int java.text.DateFormat.YEAR_FIELD ... public static final int java.text.DateFormat.SHORT public static final int java.text.DateFormat.DEFAULT } final class java.lang.reflect.Field extends AccessibleObject implements Member 18 Þ Class<?> getDeclaringClass() Liefert das Class-Exemplar für die Klasse oder die Schnittstelle, in der die Variable deklariert wurde. Diese Methode ist Teil der Schnittstelle Member. Þ int getModifiers() Liefert die deklarierten Modifizierer für die Variable. Þ String getName() Liefert den Namen der Variable. Diese Methode ist Teil der Schnittstelle Member. Þ Class<?> getType() Liefert ein Class-Objekt, das dem Datentyp der Variable entspricht. Þ String toString() Liefert eine String-Repräsentation. Am Anfang stehen die Sichtbarkeitsmodifizierer (public, protected oder private), und es folgen die weiteren Modifizierer (static, final, transient, volatile). Dann kommt der Datentyp, gefolgt vom voll qualifizierten Namen der deklarierenden Klasse, und schließlich der Name der Variable. 1245 1507.book Seite 1246 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Abbildung 18.2: UML-Diagramm mit den Unterklassen von Member 18.3.2 Methoden einer Klasse erfragen Um herauszufinden, über welche Methoden eine Klasse verfügt, wenden wir eine ähnliche Vorgehensweise an wie bei den Variablen: getMethods(). Diese Methode liefert ein Array mit Method-Objekten. Über ein Method-Objekt lassen sich Methodenname, Ergebnistyp, Parametertypen, Modifizierer und eventuell resultierende Exceptions erfragen. Wir werden später sehen, dass sich die durch ein Method-Exemplar repräsentierte Methode über invoke() aufrufen lässt. 1246 1507.book Seite 1247 Mittwoch, 12. Oktober 2011 12:49 12 18.3 Attribute, Methoden und Konstruktoren Hinweis Auch wenn zwei Klassen die gleiche Methode besitzen, muss doch ein Method-Objekt immer für jede Klasse erfragt werden. Method-Objekte sind immer mit dem Class-Objekt verbunden. final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ Method[] getMethods() Gibt ein Array von Method-Objekten zurück, die alle öffentlichen Methoden der Klasse/ Schnittstelle beschreiben. Geerbte Methoden werden mit in die Liste übernommen. Die Elemente sind nicht sortiert, noch gibt es keine Reihenfolge. Die Länge des Arrays ist null, wenn es keine öffentlichen Methoden gibt. Þ Method getMethod(String name, Class... parameterTypes) throws NoSuchMethodException Liefert zu einem Methodennamen und einer Parameterliste das passende Method-Objekt oder löst eine NoSuchMethodException aus. Besitzt die Methode keine Parameter – wie eine übliche getXXX()-Methode –, ist das Argument null und wird wegen der Varargs auf Class[] angepasst. Nachdem wir nun mittels getMethods() ein Array von Method-Objekten erhalten haben, lassen die Method-Objekte verschiedene Abfragen zu. So liefert getName() den Namen der Methode, getReturnType() den Ergebnistyp, und getParameterTypes() erzeugt ein Array von Class-Objekten, das die Typen der Methodenparameter widerspiegelt. Wir kennen dies schon von den Attributen. Wir wollen nun ein Programm betrachten, das alle Methoden und ihre Parametertypen sowie Ausnahmen ausgibt: Listing 18.8: com/tutego/insel/meta/ShowMethods.java package com.tutego.insel.meta; import java.lang.reflect.*; class ShowMethods { public static void main( String[] args ) { showMethods( java.awt.Color.BLACK ); } 1247 18 1507.book Seite 1248 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen static void showMethods( Object o ) { for ( Method method : o.getClass().getMethods() ) { String returnString = method.getReturnType().getName(); System.out.print( returnString + " " + method.getName() + "(" ); Class<?>[] parameterTypes = method.getParameterTypes(); for ( int k = 0; k < parameterTypes.length; k++ ) { String parameterString = parameterTypes[k].getName(); System.out.print( " " + parameterString ); if ( k < parameterTypes.length – 1 ) System.out.print( ", " ); } System.out.print( " )" ); Class<?>[] exceptions = method.getExceptionTypes(); if ( exceptions.length > 0 ) { System.out.print( " throws " ); for ( int k = 0; k < exceptions.length; k++ ) { System.out.print( exceptions[k].getName() ); if ( k < exceptions.length – 1 ) System.out.print( ", " ); } } System.out.println(); } } } Die Ausgabe sieht gekürzt so aus: int hashCode( ) boolean equals( java.lang.Object ) java.lang.String toString( ) 1248 1507.book Seite 1249 Mittwoch, 12. Oktober 2011 12:49 12 18.3 Attribute, Methoden und Konstruktoren ... [F getRGBColorComponents( [F ) ... void wait( long ) throws java.lang.InterruptedException void notify( ) void notifyAll( ) Wir bemerken an einigen Stellen eine kryptische Notation, wie etwa »[F«. Dies ist aber lediglich wieder die schon erwähnte Kodierung für Array-Typen. So gibt getRGB-Components() ein float-Array zurück und erwartet ein float-Array als Argument. final class java.lang.reflect.Method extends AccessibleObject implements GenericDeclaration, Member Þ Class<?> getDeclaringClass() Liefert das Class-Exemplar für die Klasse oder die Schnittstelle, in der die Methode deklariert wurde. Diese Methode ist Teil der Schnittstelle Member. Þ String getName() Liefert den Namen der Methode. Diese Methode ist Teil der Schnittstelle Member. Þ int getModifiers() Liefert die Modifizierer. Diese Methode ist Teil der Schnittstelle Member. Þ Class<?> getReturnType() 18 Gibt ein Class-Objekt zurück, das den Ergebnistyp beschreibt. Þ Class<?>[] getParameterTypes() Liefert ein Array von Class-Objekten, die die Typen der Parameter beschreiben. Die Reihenfolge entspricht der deklarierten Parameterliste. Das Array hat die Länge null, wenn die Methode keine Parameter erwartet. Þ Class<?>[] getExceptionTypes() Liefert ein Array von Class-Objekten, die mögliche Exceptions beschreiben. Das Array hat die Länge null, wenn die Methode keine solchen Exceptions mittels throws deklariert. Das Feld spiegelt nur die throws-Klausel wider. Sie kann prinzipiell auch zu viele Exceptions enthalten, bei einer Methode foo() throws RuntimeException, NullPointerException etwa genau die beiden Ausnahmen. Þ String toString() Liefert eine String-Repräsentation der Methode, ähnlich dem Methodenkopf in einer Deklaration. 1249 1507.book Seite 1250 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen 18.3.3 Properties einer Bean erfragen Eine Bean besitzt Properties (Eigenschaften), die in Java (bisher) durch Setter und Getter ausgedrückt werden, also Methoden, die einer festen Namenskonvention folgen. Gibt es Interesse an den Properties, lässt sich natürlich getMethods() auf dem Class-Objekt aufrufen und nach den Methoden filtern, die der Namenskonvention entsprechen. Die Java-Bibliothek bietet aber im Paket java.beans eine einfachere Lösung für Beans: einen PropertyDescriptor. Beispiel Gib alle Properties von Color aus (es gibt nur lesbare): Listing 18.9: com/tutego/insel/meta/PropertyDescriptors.java, main() BeanInfo beanInfo = Introspector.getBeanInfo( Color.class ); for ( PropertyDescriptor pd : beanInfo.getPropertyDescriptors() ) System.out.println( pd.getDisplayName() + " : " + pd.getPropertyType().getName() ); Die Ausgabe: RGB : int alpha : int blue : int class : java.lang.Class colorSpace : java.awt.color.ColorSpace green : int red : int transparency : int Interessanter sind vom PropertyDescriptor die Methoden getReadMethod() und getWriteMethod(), die beide ein Method-Objekt liefern – sofern es verfügbar ist –, um so die Methode gleich aufrufen zu können. BeanInfo liefert mit getPropertyDescriptors() zwar die Properties, kann jedoch über getMethodDescriptors() auch alle anderen Methoden liefern. 18.3.4 Konstruktoren einer Klasse Konstruktoren und Methoden haben einige Gemeinsamkeiten, unterscheiden sich aber insofern, als Konstruktoren keinen Rückgabewert haben. Die Ähnlichkeit zeigt sich auch in der Methode getConstructors(), die ein Array von Constructor-Objekten zurückgibt. Über dieses Array lassen sich dann wieder Name, Modifizierer, Parameter und Exceptions der Konstrukto- 1250 1507.book Seite 1251 Mittwoch, 12. Oktober 2011 12:49 12 18.3 Attribute, Methoden und Konstruktoren ren einer Klasse erfragen. Wie wir in Abschnitt 18.4.1, »Objekte erzeugen«, sehen werden, lassen sich auch über die Methode newInstance() neue Objekte erzeugen. Wegen der weitgehenden Ähnlichkeit der Klassen Constructor und Method sind die folgenden Methoden hier nicht näher beschrieben. Beispiel Zeige alle Konstruktoren der Color-Klasse: Listing 18.10: com/tutego/insel/meta/ShowConstructors.java, main() for ( Constructor<?> c : java.awt.Color.class.getConstructors() ) System.out.println( c ); Die Klasse Constructor implementiert eine auskunftsfreudige toString()-Methode. Die String-Repräsentation zeigt die Signatur mit Sichtbarkeit. Nach dem Aufruf erhalten wir: public java.awt.Color(float,float,float,float) public java.awt.Color(int) public java.awt.Color(int,int,int) public java.awt.Color(int,int,int,int) public java.awt.Color(java.awt.color.ColorSpace,float[],float) public java.awt.Color(int,boolean) public java.awt.Color(float,float,float) final class java.lang.Class<T> 18 implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ Constructor[] getConstructors() Liefert ein Feld mit Constructor-Objekten. Þ Constructor<T> getConstructor(Class... parameterTypes) throws NoSuchMethodException Liefert ein ausgewähltes Constructor-Objekt. final class java.lang.reflect.Constructor<T> extends AccessibleObject implements GenericDeclaration, Member Þ Class<T> getDeclaringClass() Eine ziemlich langweilige Methode, da Konstruktoren nicht vererbt werden. Sie gibt immer nur jene Klasse aus, von der das Class-Objekt kommt. Das ist ein wichtiger Unterschied zwischen Methoden und Konstruktoren, der bei dieser Methode deutlich auffällt. 1251 1507.book Seite 1252 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Þ Class[] getExceptionTypes() Þ int getModifiers() Þ String getName() Þ Class[] getParameterTypes() Abbildung 18.3: UML-Diagramm mit den Unterklassen von Member 1252 1507.book Seite 1253 Mittwoch, 12. Oktober 2011 12:49 12 18.4 18.3.5 Objekte erzeugen und manipulieren Annotationen Annotationen erfragen Methoden der Schnittstelle AnnotatedElement, die unter anderem Class, Constructor, Field, Method und Package implementieren. Ein Blick in AnnotatedElement verrät, wie an die Annotationen heranzukommen ist: interface java.lang.reflect.AnnotatedElement Þ Annotation[] getAnnotations() Liefert alle mit diesem Element assoziierten Annotationen. Þ Annotation[] getDeclaredAnnotations() Liefert alle an diesem Element deklarierten Annotationen. Vererbte Annotationen werden ignoriert. Þ boolean isAnnotationPresent(Class<? extends Annotation> annotationType) Erfragt, ob das Element eine bestimmte Annotation besitzt. Þ <T extends Annotation> T getAnnotation(Class<T> annotationType) Liefert die Annotationen eines gewünschten Typs. In Abschnitt 18.5, »Eigene Annotationstypen«, kommen wir auf Annotationen zurück. 18.4 Objekte erzeugen und manipulieren Nachdem wir nun genügend über das Ausfragen von Klassen-, Variablen-, Methoden- und Konstruktor-Objekten wissen, wollen wir aktiv eigene Objekte erzeugen, Werte von Variablen abfragen und verändern sowie Methoden dynamisch per Reflection aufrufen. 18.4.1 Objekte erzeugen Der new-Operator erzeugt in Java zur Laufzeit ein Exemplar einer Klasse. Der Compiler muss dazu den Namen der Klasse kennen, sodass er einen passenden Konstruktor-Aufruf erzeugen kann. Kennen wir aber erst später zur Laufzeit den Namen der gewünschten Klasse für unser Objekt, so fällt die new-Operation flach, weil der new-Operator nicht für diesen Spezialfall gedacht ist. Um Exemplare bestimmter Klassen dynamisch zu erzeugen, brauchen wir wieder ein passendes Class-Objekt. Nun holen wir uns mit getConstructor() ein Konstruktor-Objekt, das den gewünschten Konstruktor beschreibt. Jedes Konstruktor-Objekt kennt eine newInstance(Object[])-Methode, die ein neues Exemplar erschafft, indem sie den zugrundeliegenden Konstruktor aufruft. Der Parameter von newInstance() ist ein Feld von Werten, die an den ech- 1253 18 1507.book Seite 1254 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen ten Konstruktor gehen. Glücklicherweise kennt Java anonyme Arrays, sodass wenig zu schreiben bleibt. Bei einem parameterlosen Konstruktor können wir einfach newInstance(null) aufrufen. Beispiel Ein Reflection-Konstruktor erzeugt ein Point-Objekt mit den Koordinaten 10, 20: Listing 18.11: com/tutego/insel/meta/CreateObject.java, main() Class<Point> pointClass = Point.class; Constructor<Point> constructor = pointClass.getConstructor( int.class, int.class ); Point p = constructor.newInstance( 10, 20 ); System.out.println( p ); final class java.lang.Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement Þ Constructor<T> getConstructor(Class... parameterTypes) throws NoSuchMethodException Liefert den sichtbaren Konstruktor mit dem gewünschten Typ. final class java.lang.reflect.Constructor<T> extends AccessibleObject implements GenericDeclaration, Member Þ T newInstance(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException Erzeugt ein neues Exemplar, indem es den durch das Constructor-Objekt repräsentierten Konstruktor mit den im Array angegebenen Parametern aufruft. Auf einige Exceptions ist zu achten. Þ IllegalAccessException: Auf den Konstruktor kann nicht zugegriffen werden (zum Beispiel, weil er privat ist). Þ IllegalArgumentException: Die Anzahl der Parameter ist falsch beziehungsweise eine Kon- vertierung der Parameterwerte in die benötigten Typen ist nicht möglich. Þ InstantiationException: Das Constructor-Objekt bezieht sich auf einen Konstruktor einer abstrakten Klasse. 1254 1507.book Seite 1255 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren InvocationTargetException Die Ausnahme InvocationTargetException ist keine RuntimeException und kommt bei zwei Methoden aus der Reflection-API vor: Þ newInstance() zum Erzeugen von Objekten bei Constructor Þ invoke() zum Aufruf von Methoden bei Method Die InvocationTargetException ist ein Mantel um genau die Ausnahme, die der aufgerufene Konstruktor beziehungsweise die Methode ausgelöst hat. Löst der Konstruktor oder die Methode eine Ausnahme aus, so generiert die JVM eine InvocationTargetException und lässt uns mit getCause() beziehungsweise mit getTargetException() den Grund als Throwable erfragen. 18.4.2 Die Belegung der Variablen erfragen Schreiben wir einen GUI-Builder oder einen Debugger, so reicht es nicht aus, nur die Namen und Datentypen der Variablen zu kennen. Wir wollen auch auf ihre Inhalte lesend und schreibend zugreifen. Das ist mithilfe der verschiedenen getXXX()-Methoden für ein Field-Objekt leicht machbar. Der erste Schritt besteht also wieder darin, ein Class-Objekt zu erfragen. Dann besorgen wir uns mittels getFields() ein Array von Attributbeschreibungen – oder mit getFields(String) ein spezielles Attribut – und nehmen das Field-Objekt für unsere gewünschte Variable. Den Wert, den das Field dann speichert, erfragt die Methode get(). Sie ist auf allen Variablentypen möglich und konvertiert automatisch in Wrapper-Objekte, wenn der Typ primitiv war. Die Field-Klasse bietet einige spezielle getXXX()-Methoden, um besonders einfach an die Werte von Variablen primitiven Typs zu gelangen. So liefert getDouble() einen doubleWert und getInt() ein int. Wir müssen daran denken, dass IllegalArgumentException und IllegalAccessException bei falschem Zugriff auftreten können. Alle getXXX()-Methoden zum Erfragen – und auch setXXX()-Methoden zum Setzen – erwarten ein Argument mit dem Verweis auf das Objekt, das die Variable besitzt. Das Argument wird ignoriert (und sollte null sein), wenn es sich um eine statische Variable handelt. Rechtecke erzeugen und erfragen Ein Programm soll ein Rectangle-Objekt mit einer Belegung für x, y, Höhe und Breite erzeugen. Anschließend erfragt getField(String) das Field-Objekt für eine Beschreibung der Variablen mit dem gegebenen Namen. Das Field-Objekt gibt mit getXXX() den Inhalt der Variablen preis. Um das Prinzip zu demonstrieren, erfragt die get()-Methode die Höhe height, die ein Integer-Objekt zurückgibt. Alle anderen Ganzzahlwerte liefert die spezialisierte Helfermethode getInt(): 1255 18 1507.book Seite 1256 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Listing 18.12: com/tutego/insel/meta/GetFieldElements.java package com.tutego.insel.meta; import java.lang.reflect.*; class GetFieldElements { public static void main( String[] args ) { Object o = new java.awt.Rectangle( 11, 22, 33, 44 ); Class<?> c = o.getClass(); try { Field heightField = c.getField( "height" ), widthField = c.getField( "width" ), xField = c.getField( "x" ), yField = c.getField( "y" ); Integer height = (Integer) heightField.get( o ); int width = widthField.getInt( o ), x = xField.getInt( o ), y = yField.getInt( o ); String s = c.getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]"; System.out.println( s ); // java.awt.Rectangle[x=11,y=22,width=33,height=44] System.out.println( o ); // java.awt.Rectangle[x=11,y=22,width=33,height=44] } catch ( NoSuchFieldException e ) { e.printStackTrace(); } catch ( SecurityException e ) { e.printStackTrace(); } 1256 1507.book Seite 1257 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren catch ( IllegalAccessException e ) { e.printStackTrace(); } } } Es erzeugt nun nach dem Aufruf die Ausgabe: java.awt.Rectangle[x=11,y=22,width=33,height=44] java.awt.Rectangle[x=11,y=22,width=33,height=44] final class java.lang.reflect.Field extends AccessibleObject implements Member Þ String getName() Liefert den Namen der Variablen. Diese Methode ist Teil der Schnittstelle Member. Þ int getModifiers() Liefert die Modifizierer. Diese Methode ist Teil der Schnittstelle Member. Þ Object get(Object obj) Þ boolean getBoolean(Object obj) Þ byte getByte(Object obj) Þ char getChar(Object obj) 18 Þ double getDouble(Object obj) Þ float getFloat(Object obj) Þ int getInt(Object obj) Þ long getLong(Object obj) Þ short getShort(Object obj) Erfragt den Wert eines Attributs. Die Referenz von obj zeigt auf das Objekt, das das Attribut enthält. Es sollte null übergeben werden, wenn es sich um eine statische Variable handelt. 18.4.3 Eine generische eigene toString()-Methode * Die toString()-Methode ist für viele Klassen nicht überlebenswichtig, aber außerordentlich praktisch. Es ist viel zu schade, hier Zeit für die Entwicklung zu investieren. Toll wäre es, wenn toString() ganz automatisch die Attribute und Belegungen analysierte und ausgäbe. Aber wer Allgemeines sucht, findet die Antwort in Reflection. Wir schreiben einfach eine statische Methode toString(Object) in eine Hilfsklasse und erfragen dann alle Attribute und die Werte des 1257 1507.book Seite 1258 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen zu untersuchenden Objekts. Etwas Programmieraufwand müssen wir noch in die Behandlung der Oberklasse investieren, denn Reflection auf einem Objekt zeigt nur die in der Klasse deklarierten Attribute, nicht aber die geerbten Attribute an. Die Lösung ergibt sich fast von selbst: Listing 18.13: com/tutego/insel/meta/ToStringHelper.java package com.tutego.insel.meta; import java.lang.reflect.*; import java.util.*; public class ToStringHelper { public static String toString( Object o ) { Collection<String> result = new ArrayList<String>(); toString( o, o.getClass(), result ); return o.getClass().getName().concat( result.toString() ); } private static void toString( Object o, Class<?> clazz, Collection<String> list ) { Field[] fields = clazz.getDeclaredFields(); AccessibleObject.setAccessible( fields, true ); for ( Field f : fields ) { try { list.add( f.getName() + "=" + f.get( o ) ); } catch ( IllegalAccessException e ) { e.printStackTrace(); } } 1258 1507.book Seite 1259 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren if ( clazz.getSuperclass().getSuperclass() != null ) toString( o, clazz.getSuperclass(), list ); } } Die private Methode toString(Object, Class, ArrayList) dient eigentlich nur dem rekursiven Aufruf durch die Oberklassen. Falls es eine Oberklasse gibt, also clazz.getSuperclass().getSuperclass() ein Objekt liefert, müssen wir für die Oberklasse ebenfalls die Attribute ablaufen. Das machen wir rekursiv. Testen wir anschließend ToStringHelper in einer Klasse ToStringHelperDemo, die von Ober abgeleitet ist. Damit bekommen wir zwei Attribute in der Oberklasse. Eines davon ist interessant (die Variable i), denn die Unterklasse überdeckt sie. Dennoch findet toString() beide Belegungen. Wäre das nicht erwünscht, müssten wir einfach die Liste durchschauen und suchen, ob schon ein Attribut mit dem gleichen Namen vorhanden ist. Da der Algorithmus rekursiv erst die Unterklasse und dann die Oberklasse(n) durchsucht, bekommen wir auch die Attribute in dem sichtbaren Bereich, wie sie auch der Benutzer sieht: Listing 18.14: com/tutego/insel/meta/ToStringHelperDemo.java package com.tutego.insel.meta; class Ober { int i = 123; 18 /* private */double d = 3.1415; } public class ToStringHelperDemo extends Ober { String hello = "world"; int i = 42; public static void main( String[] args ) { ToStringHelperDemo t = new ToStringHelperDemo(); System.out.println( ToStringHelper.toString( t ) ); // ToStringHelperTest[hello=world, i=42, i=123, d=3.1415] } } 1259 1507.book Seite 1260 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen 18.4.4 Variablen setzen Bei Debuggern oder grafischen Editoren ist es nur eine Seite der Medaille, die Werte von Variablen anzuzeigen. Hinzu kommt noch das Setzen der Werte von Variablen. Dies ist aber genauso einfach wie das Abfragen. Anstelle der getXXX()-Methoden kommen nun verschiedene setXXX()-Methoden zum Einsatz. So trägt setBoolean() einen Wahrheitswert oder setDouble() eine Fließkommazahl in eine Variable ein. Eine allgemeine set()-Methode dient Objektreferenzen wie im Fall von get(). Die Methode set() nimmt ebenso Wrapper-Objekte für Variablen von primitiven Datentypen. Die folgenden set<Typ>()-Methoden setzen daher alle »ihren« Datentyp. Wir müssen aber dafür sorgen, dass die Variable existiert und wir Zugriff darauf haben. In allen Fällen muss auf IllegalArgumentException und IllegalAccessException geachtet werden. Das folgende Programm erzeugt klassisch ein Point-Objekt mit dem Konstruktor, der x und y setzt. Anschließend verändert die eigene Methode modify() ein gewünschtes Attribut: Listing 18.15: com/tutego/insel/meta/SetFieldElements.java package com.tutego.insel.meta; import java.lang.reflect.*; import java.awt.*; class SetFieldElements { public static void main( String[] args ) { Point p = new Point( 11, 22 ); System.out.println( p ); modify( p, "x", 1111 ); // java.awt.Point[x=11,y=22] modify( p, "y", 2222 ); // java.awt.Point[x=1111,y=2222] System.out.println( p ); modify( p, "z", 0 ); // java.lang.NoSuchFieldException: z } static void modify( Object o, String name, Integer param ) { 1260 1507.book Seite 1261 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren try { Field field = o.getClass().getField( name ); field.set( o, param ); } catch ( NoSuchFieldException e ) { e.printStackTrace(); } catch ( IllegalAccessException e ) { e.printStackTrace(); } } } Die Veränderung der Variablen erfolgt mit der set()-Methode. Da wir primitive Datentypen übergeben, wickeln wir sie für die modify()-Methode in ein Integer-Objekt ein. Das IntegerObjekt haben wir nicht explizit programmiert, denn es wird über Boxing vom Compiler selbst zur Verfügung gestellt. Für bekannte Typen könnten wir neben der allgemeinen Methode set() auch etwa setInt() verwenden. final class java.lang.reflect.Field extends AccessibleObject implements Member 18 Þ void set(Object obj, Object value) Setzt das Attribut des Objekts obj, das dieses Field-Objekt repräsentiert, auf den neuen Wert value. Þ void setBoolean(Object obj, boolean z) Þ void setByte(Object obj, byte b) Þ void setChar(Object obj, char c) Þ void setDouble(Object obj, double d) Þ void setFloat(Object obj, float f) Þ void setInt(Object obj, int i) Þ void setLong(Object obj, long l) Þ void setShort(Object obj, short s) Belegt das Feld eines Objekts obj mit einem primitiven Element. 1261 1507.book Seite 1262 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen 18.4.5 Bean-Zustände kopieren * In mehrschichtigen Anwendungen gibt es oft das Muster, dass eine JavaBean etwa über eine objekt-relationale Mapping-Technologie automatisch aus einer Datenbankzeile aufgebaut wird und dann intern in der Geschäftsschicht verwendet wird. Soll nun diese Information über das Netzwerk an einen anderen Rechner verteilt werden, ist es nicht immer angebracht, diese JavaBean etwa direkt über Serialisierung zu versenden. Stattdessen kann ein TransferObjekt aufgebaut werden, eine spezielle JavaBean zum Beispiel, sodass der Empfänger keine Abhängigkeit zu der Bean in der internen Geschäftsschicht hat. Nun werden sich aber diese Geschäftsschicht-Bean und die Transfer-Bean sehr ähnlich sein, und viele Entwickler scheuen die Mühe, lästigen Kopiercode zu erstellen. Doch manuelle Arbeit ist nicht nötig, und eine Lösung für das Kopierproblem ist über Refection schnell geschrieben. Über die BeanInfo kommen wir an den PropertyDescriptor (siehe dazu Abschnitt 18.3.3, »Properties einer Bean erfragen«), und dann liefern getReadMethod() und getWriteMethod() die Setter/Getter. Bei einer eigenen Kopiermethode wie copyProperties(Object source, Object target) müssen wir bei der Quell-Bean jede Property auslesen und entsprechend bei der Ziel-Bean nach der Property suchen und den Setter aufrufen. Wenn das Ganze ohne Typkonvertierungen programmiert werden soll, sind es nur wenige Zeilen Programmcode. Kommen einfache Konvertierungen dazu, etwa wenn einmal ein Wrapper als Property-Typ genutzt wird und einmal der primitive Datentyp, ist es etwas mehr. Der Aufwand mit einer eigenen Implementierung ist allerdings nicht nötig, denn zwei populäre Implementierungen können helfen: Þ Apache Commons BeanUtils (http://commons.apache.org/beanutils/): Die Klasse org.apache.commons.beanutils.BeanUtils bietet praktische statische Methoden wie copyProperty(Object bean, String name, Object value), copyProperties(Object dest, Object orig), Object cloneBean(Object bean) oder populate(Object bean, Map properties). Þ Dozer (http://dozer.sourceforge.net/): Dozer bringt ausgefeilte Mapping-Möglichkeiten mit, die weit über BeansUtils hinausgehen. Das geht so weit, dass es ein Eclipse-Plugin zur Konfiguration der Abbildungen gibt. 18.4.6 Private Attribute ändern Wenn es der Sicherheitsmanager zulässt, kann ein Programm auch private- oder protectedAttribute ändern und Methoden/Konstruktoren eingeschränkter Sichtbarkeit aufrufen. Die Schlüsselfigur in diesem Spiel ist die Oberklasse java.lang.reflect.AccessibleObject, die den Klassen Constructor, Field und Method die Methode setAccessible(boolean) vererbt. Ist das Argument true und lässt der Sicherheitsmanager die Operation zu, lässt sich auf jedes Element (also Konstruktor, Attribut oder Methode) zugreifen: 1262 1507.book Seite 1263 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren Listing 18.16: com/tutego/insel/meta/ReadPrivate.java package com.tutego.insel.meta; public class ReadPrivate { @SuppressWarnings( "all" ) private String privateKey = "Schnuppelhase"; public static void main( String[] args ) throws Exception { ReadPrivate key = new ReadPrivate(); Class<?> c = key.getClass(); java.lang.reflect.Field field = c.getDeclaredField( "privateKey" ); field.setAccessible( true ); System.out.println( field.get(key) ); // Schnuppelhase field.set( key, "Schnuckibutzihasidrachelchen"); System.out.println( field.get(key) ); // Schnuckibutzihasidrachelchen } } Warnung Mit dieser Technik lässt sich viel Unsinn anrichten. Es gibt Dinge, die in der Laufzeitumgebung einfach fest sein müssen. Dazu zählen einmal angelegte Strings oder Wrapper-Objekte. Strings sind immutable, weil sie intern in einem privaten char-Feld gehalten werden und es keine Modifikationsmöglichkeiten gibt. Auch Wrapper-Objekte sind, wenn sie einmal mit einem Konstruktor angelegt wurden, nicht über öffentliche Methoden veränderbar. Sie anschließend per Reflection zu modifzieren bringt große Unordnung, insbesondere bei den gecachten Integer/Long-Wrapper-Objekten, die die statischen valueOf()-Methoden liefern. 18.4.7 Methoden aufrufen Nach dem Abfragen und Setzen von Variablenwerten und Konstruktor-Aufrufen zum Erzeugen eines Objekts ist das Aufrufen von Methoden per Reflection der letzte Schritt. Wenn zur Compilezeit der Name der Methode nicht feststeht, lässt sich zur Laufzeit dennoch eine im Programm deklarierte Methode aufrufen, wenn ihr Name als Zeichenkette vorliegt. 1263 18 1507.book Seite 1264 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Zunächst gehen wir wieder von einem Class-Objekt aus, das die Klasse des Objekts beschreibt, für das eine Objektmethode aufgerufen werden soll. Anschließend wird ein Method-Objekt als Beschreibung der gewünschten Methode benötigt; wir bekommen dies mit der Methode getMethod() aus dem Class-Exemplar. getMethod() verlangt zwei Argumente: einen String mit dem Namen der Methode und ein Array von Class-Objekten. Jedes Element dieses Arrays entspricht einem Parametertyp aus der Signatur der Methode. Damit werden überladene Methoden unterschieden. Nachdem wir das beschreibende Method-Exemplar und die Parameterwerte für den Aufruf vorbereitet haben, ruft invoke() die Zielmethode auf – im Englischen heißt dies dynamic invocation. invoke() erwartet zwei Argumente: ein Array mit Argumenten, die der aufgerufenen Methode übergeben werden, und eine Referenz auf das Objekt, auf dem die Methode aufgerufen werden soll und zur Auflösung der dynamischen Bindung dient. final class java.lang.reflect.Method extends AccessibleObject implements GenericDeclaration, Member Þ Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException Ruft eine Methode des Objekts obj mit den gegebenen Argumenten auf. Wie schon beim Konstruktor löst die Methode eine InvocationTargetException aus, wenn die aufzurufende Methode eine Exception auslöst. Beispiel Wir erzeugen ein Point-Objekt und setzen im Konstruktor den x-Wert auf 10. Anschließend fragen wir mit der Methode getX(), die wir dynamisch aufrufen, den x-Wert wieder ab: Listing 18.17: com/tutego/insel/meta/InvokeMethod.java, main() Point p = new Point( 10, 0 ); Method method = p.getClass().getMethod( "getX" ); String returnType = method.getReturnType().getName(); Object returnValue = method.invoke( p ); System.out.printf( "(%s) %s", returnType, returnValue ); // (double) 10.0 Beispiele der Varargs sind bei getMethod() die Parametertypen und bei invoke() die Argumente für setLocation(). Da getMethod() eine beliebige Anzahl von Argumenten annehmen kann und kein Argument dazuzählt, muss die Methode nicht so parametrisiert werden: Method method = p.getClass().getMethod( "getX", (Class[]) null ); 1264 1507.book Seite 1265 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren Auffälliger ist die Möglichkeit der variablen Argumentanzahl bei invoke(). Da ein Getter keine Parameter besitzt, heißt es kurz method.invoke(p); statt wie vor Java 5: method.invoke( p, (Object[]) null ); Interessant sind Methoden mit Parameterliste, wie setLocation(): Point p = new Point(); Method method = p.getClass().getMethod( "setLocation", int.class, int.class ); method.invoke( p, 1, 2 ); System.out.println( p ); 18.4.8 Statische Methoden aufrufen Wir wollen ein Beispiel programmieren, in dem die Klasse InvokeMain die statische main()-Methode einer anderen Klasse, HasMain, mit einem Parameter aufruft: Listing 18.18: com/tutego/insel/meta/InvokeMain.java package com.tutego.insel.meta; import java.lang.reflect.*; import java.util.Arrays; public class InvokeMain 18 { public static void main( String[] args ) throws Exception { String[] argv = { "-option", "Parameter" }; Method method = Class.forName( "com.tutego.insel.meta.HasMain" ). getMethod( "main", argv.getClass() ); method.invoke( null, new Object[]{ argv } ); } } class HasMain { public static void main( String[] args ) 1265 1507.book Seite 1266 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen { System.out.println( "Got: " + Arrays.toString( args ) ); } } 18.4.9 Dynamische Methodenaufrufe bei festen Methoden beschleunigen * Werden über Reflection Methoden aufgerufen, deren Methodennamen erst zur Laufzeit bestimmt werden, so verlieren wir die Typsicherheit vom Compiler, und die Geschwindigkeit ist nicht optimal – auch wenn es seit Java 5 nicht mehr so schlimm ist (doch immer noch zeigt eine einfache Zeitmessung einen deutlichen Unterschied). Diese Aufrufe lassen sich prinzipbedingt auch durch einen JIT-Compiler nicht weiter beschleunigen. Wir müssen also nach einer Lösung suchen, mit der wir diese Art von Aufruf beschleunigen können. Ein möglicher Weg hierbei ist, in Kenntnis des Namens der Methode – nennen wir die Methode meth() – den Namen in einer (abstrakten) Oberklasse dem Compiler bereits bekannt zu machen. Reflection ist nur zum Laden einer Unterklasse mit gegebenem Namen nötig; die normale, dynamische Methodenbindung erledigt den Rest – ganz ohne versteckte Schnüre, doppelte Böden oder Spiegel (Reflection). Versuchen wir, den folgenden Code nach diesem Schema zu ändern: Listing 18.19: com/tutego/insel/meta/DynamReflection.java, main() Class<?> clazz = Class.forName("com.tutego.insel.meta.DynamReflectionMethod" ); Object o = clazz.newInstance(); clazz.getMethod( "meth" ).invoke( o ); DynamReflection ist die Hauptklasse, die die Klasse DynamReflectionMethod über Class.forName() anfordert: Listing 18.20: com/tutego/insel/meta/DynamReflectionMethod.java package com.tutego.insel.meta; public class DynamReflectionMethod { @Override public void meth() { System.out.println( "Bewusste Raucher trinken Filterkaffee" ); } } 1266 1507.book Seite 1267 Mittwoch, 12. Oktober 2011 12:49 12 18.4 Objekte erzeugen und manipulieren Über das Class-Objekt erzeugt newInstance() ein neues Exemplar. getMethod() sucht die Beschreibung der Methode meth() heraus, und invoke() ruft die Methode meth() auf. Hier genau entsteht ein kleiner Geschwindigkeitsverlust. Wenn es uns gelänge, um das invoke() herumzukommen, wäre das schon ein großer Fortschritt. Dies schaffen wir, indem wir eine Schnittstelle (oder Oberklasse) für DynamReflectionMethod konstruieren, die genau diese Methode vorschreibt. Die implementierende Klasse (beziehungsweise Unterklasse) wird dann eine Implementierung angeben: Listing 18.21: com/tutego/insel/meta/DynamAbstract.java package com.tutego.insel.meta; interface DynamBase { void meth(); } class DynamBaseMethod implements DynamBase { public void meth() { System.out.println( "Bewusste Raucher trinken Filterkaffee" ); } } 18 public class DynamAbstract { public static void main( String[] args ) throws Exception { Class<?> clazz = Class.forName( "com.tutego.insel.meta.DynamBaseMethod" ); DynamBase o = (DynamBase) clazz.newInstance(); o.meth(); } } DynamBase ist eine Schnittstelle, die zur Übersetzungszeit bekannt ist. Die virtuelle Maschine löst den Aufruf nach den üblichen Regeln der dynamischen Bindung selbst auf. Die Klasse DynamBaseMethod wird ebenfalls erst zur Laufzeit geladen. Wir verstecken hier sehr elegant den Aufwand. Wir haben die gleiche Funktionalität und Flexibilität wie im vorangegangenen Reflection-Beispiel – wenn wir die Möglichkeit, den Klassennamen durch einen String anzu- 1267 1507.book Seite 1268 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen geben, außer Acht lassen –, aber mit der höheren Geschwindigkeit eines konventionellen Methodenaufrufs ohne Reflection. Hinweis Der Aufruf von Class.forName() liefert ein Class-Objekt, bei dem Typ nicht bekannt ist. Daher ist unsere Variable clazz mit Class<?> deklariert. Bei newInstance() ist dann auch eine explizite Typanpassung auf den Ergebnistyp nötig, was nicht nötig wäre, wenn das Class-Objekt korrekter wäre. Um das Class-Objekt von Class.forName() zu spezialisieren, gibt es eine Methode asSubclass(). Dann lässt sich statt dem bekannten Class<?> clazz = Class.forName( "DynamBaseMethod" ); DynamBase o = (DynamBase) clazz.newInstance(); Folgendes schreiben: Class<? extends DynamBase> clazz = Class.forName( "DynamBaseMethod" ).asSubclass( DynamBase.class ); DynamBase o = clazz.newInstance(); 18.5 Eigene Annotationstypen * Die in der Java-Standardbibliothek vorgegebenen Annotationen haben entweder eine besondere Semantik für den Compiler, wie @Override oder @SuppressWarnings, oder dienen zum Beispiel zur Definition von Web-Services (@WebService, @WebMethod, ...) oder von Komponenten mit XML-Abbildung (@XmlRootElement, @XmlElement, ...). Insbesondere die Java Enterprise Edition (Java EE) macht von Annotationen fleißig Gebrauch, und es lassen sich auch neue Annotationstypen deklarieren. 18.5.1 Annotationen zum Laden von Ressourcen Im Folgenden wollen wir drei Annotationstypen deklarieren, die den Inhalt von Objektvariablen beschreiben. Zunächst werden die Annotationstypen selbst beschrieben, und abschließend folgt eine Klasse, die die Annotationen ausliest und die Ressourcen initialisiert. Es soll möglich sein, mit @CurrentDateResource eine Objektvariable mit dem aktuellen Datum zu belegen: @CurrentDateResource public Date now; 1268 1507.book Seite 1269 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * Ist eine Variable mit @ListOfFilesResource annotiert, so sollen alle Dateien und Unterverzeichnisse aus einem gegebenen Verzeichnis aufgelistet und damit ein Feld initialisiert werden: @ListOfFilesResource( "c:/" ) String[] files; Die Annotation @UrlResource ist die komplexeste Annotation. Sie beschreibt im einfachsten Fall eine URL mit Daten von einem HTTP-Server (mit dem URL-Protokoll file:// auch vom lokalen Dateisystem), sodass eine Variable mit dem Inhalt initialisiert werden kann: @UrlResource( "http://tutego.de/aufgaben/bond.txt" ) String testFile; Der Annotation lassen sich noch einige Attribute (Element-Wert-Paare) übergeben, sodass etwa Leerraum entfernt wird oder der String in Groß-/Kleinbuchstaben konvertiert wird: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", trim = true, upperLowerCase = UpperLowerCase.UPPERCASE ) public String testFile; Zu guter Letzt lassen sich bei @UrlResource auch beliebige Konvertierer-Klassen angeben, die den Text der Ressource transformieren: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", converter = { RemoveNoWordCharactersConverter.class, 18 SortConverter.class } ) public String testFile; 18.5.2 Neue Annotationen deklarieren Ein Annotationstyp (engl. annotation type) wird so deklariert wie eine Schnittstelle, nur steht vor dem Schlüsselwort interface ein @-Zeichen. Beginnen wir mit dem einfachsten Annotationstyp, CurrentDateResource: public @interface CurrentDateResource { } Die Ähnlichkeit von neuen Annotationstypen und Schnittstellen ist so groß, dass in der Java Language Specification die Annotationen auch im Kapitel über Schnittstellen behandelt werden. (Später erfahren wir den Grund dafür: Der Compiler übersetzt die Annotationstypen in Schnittstellen.) 1269 1507.book Seite 1270 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Wo sich der Annotationstyp festmachen lässt, kann eingeschränkt werden. Im Standardfall kann er überall angeheftet werden, das heißt an beliebigen Typdeklarationen, Annotationen, Aufzählungen, Objekt-/Klassenvariablen, lokalen Variablen, Parametern, Methoden, Konstruktoren oder auch an Paketen (wobei die Syntax da etwas anders ist). Damit ist Folgendes erlaubt: @CurrentDateResource public Date now; 18.5.3 Annotationen mit genau einem Attribut Der Annotationstyp @CurrentDateResource kann mit keinem zusätzlichen Attribut versehen werden, da er in der bisherigen Schreibweise eine Markierungsannotation ist. Erlaubt sind zwar ein Paar runde Klammern hinter dem Namen und auch Kommentare, aber eben kein zusätzliches Attribut, wie es @ListOfFilesResource etwa wünscht: @CurrentDateResource public Date now; @CurrentDateResource() public Date now; @CurrentDateRessource( "gestern" ) public Date now; // Compilerfehler Damit zusätzliche Informationen für den Pfadnamen bei @ListOfFilesResource("c:/") möglich sind, werden im Annotationstyp Deklarationen für Attribute eingesetzt, deren Schreibweise an Operationen einer Java-Schnittstelle erinnert. (Aber die Operationen dürfen keinen Parameter besitzen, die Rückgabe darf nicht void sein und kein throws besitzen. Und Operationen, die so heißen wie die Methoden aus Object, sind nicht zugelassen.) Damit ein zusätzliches Attribut den Pfadnamen annehmen kann, sieht die Deklaration des Annotationstyps ListOfFilesResource so aus: public @interface ListOfFilesResource { String value(); } Damit haben wir den zweiten Annotationstyp aus unserem Beispiel vorbereitet, und gültig wäre: @ListOfFilesResource( "c:/" ) String[] files; Fehlt das erwartete Element, also der Pfad-String, gibt es einen Compilerfehler. 1270 1507.book Seite 1271 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * Attributtypen Das, was so wie ein Rückgabetyp einer Methode aussieht, bestimmt den Typ des Attributs und ist im begrenzten Rahmen wählbar. Der Typ muss nicht immer nur String sein. Insgesamt erlaubt Java: Þ alle primitiven Datentypen (byte, short, int, long, float, double, boolean), aber keine Wrapper Þ String Þ Class. Insbesondere mit der generischen Angabe ermöglicht er eine präzise Klassenangabe. Þ Enum-Typen Þ andere Annotationen (was zu geschachtelten Annotationen führt) Þ Felder von oben genannten Typen. Felder von Feldern (mehrdimensionale Felder) sind aber nicht gestattet. Hinweis Die Attribute sind typisiert, und fehlerhafte Typen lehnt der Compiler ab. null ist als Argument nie erlaubt. Mögliche Typkonvertierungen führt der Compiler automatisch durch: @ListOfFilesResource( "" ) String[] files; // OK @ListOfFilesResource() String[] files; // Compilerfehler @ListOfFilesResource( null ) String[] files; // Compilerfehler @ListOfFilesResource( 1 ) String[] files; // Compilerfehler @ListOfFilesResource( 'C' ) String[] files; // Compilerfehler @ListOfFilesResource( "C:" + '/' ) String[] files; // OK 18.5.4 18 Element-Werte-Paare (Attribute) hinzufügen Wenn der Annotationstyp ein Attribut mit dem Namen value deklariert, so muss keine Angabe über einen Schlüsselnamen gemacht werden. Möglich wäre das aber schon, und geschrieben würde das so: @ListOfFilesResource( value = "c:/" ) String[] files; Eine Annotation lässt sich mit einer beliebigen Anzahl von Attributen deklarieren, und das Attribut muss auch nur dann value heißen, wenn der Schlüssel nicht ausdrücklich genannt werden soll – also @ListOfFilesResource("c:/") statt @ListOfFilesResource(value = "c:/"). Ist mehr als ein Attribut nötig, muss ohnehin immer der Attributname zusammen mit der Belegung genannt werden. 1271 1507.book Seite 1272 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Wenn @ListOfFilesResource mit einem Attribut trim ausgestattet wird, sodass die gelesenen Texte automatisch vorne und hinten den Weißraum abgeschnitten bekommen, so könnte die Deklaration des Annotationstyps so aussehen: public @interface UrlResource { String value(); boolean trim(); } Und in der Anwendung: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", trim = true ) String testFile; 18.5.5 Annotationsattribute vom Typ einer Aufzählung Bisher haben wir als Attributtyp String und boolean eingesetzt. Attribute dürfen auch Aufzählungen sein. Wir wollen das für @UrlResource nutzen, damit wir beim Einlesen wählen können, ob der Text in Groß- oder Kleinbuchstaben konvertiert wird: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", upperLowerCase = UpperLowerCase.UPPERCASE ) String testFile; Für die Konvertierungsart deklarieren wir zunächst eine Aufzählung und deklarieren das Attribut upperLowerCase dann genau mit dem Aufzählungstyp: public @interface UrlResource { public enum UpperLowerCase { UNCHANGED, LOWERCASE, UPPERCASE } String value(); UpperLowerCase upperLowerCase(); } Die Aufzählung UpperLowerCase als inneren Typ zu deklarieren, ist interessant, da sie ja nicht allgemein ist, sondern ausschließlich mit der Annotation @UrlResource Sinn ergibt. 1272 1507.book Seite 1273 Mittwoch, 12. Oktober 2011 12:49 12 18.5 18.5.6 Eigene Annotationstypen * Felder von Annotationsattributen Von den unterschiedlichen Elementtypen dürfen eindimensionale Felder gebildet werden. Da es keine anderen Sammlungen gibt, stellt das Feld die einzige Möglichkeit dar, beliebig viele Elemente anzugeben. Der @UrlResource sollen beliebig viele Konvertierungsfilter zugewiesen werden. Konvertierungsfilter sind Klassen, die die Schnittstelle ResourceConverter implementieren und den eingelesenen String transformieren. Dann heißt es in der Deklaration des Annotationstyps: public @interface UrlResource { String value(); Class<? extends ResourceConverter>[] converter(); } Der interessante Teil ist natürlich Class<? extends ResourceConverter>[]. Der setzt sich wie folgt zusammen: Þ Da Java es nicht erlaubt, dass beliebige Attributtypen verwendet werden, bleiben bei der Angabe der Konverter nur Class-Objekte und nicht etwa ResourceConverter[]. Þ Die Typangabe Class[] wäre nicht ausreichend, da Class mit einem generischen Typ präzi- siert werden muss. Jetzt ist aber Class<ResourceConverter> auch noch nicht präzise, denn wir wollen ja nicht nur exakt den Typ RessourceConverter treffen, sondern Untertypen, also Klassen, die RessourceConverter erweitern. Damit sind wir bei Class<? extends ResourceConverter>. Þ Da es eine Liste von Class-Angaben werden kann, muss das Paar eckiger Klammen an die Deklaration. Weisen wir zum Beispiel zwei Konverter – die Klassen wurden noch nicht vorgestellt, aber das folgt – der @UrlResource zu: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", converter = { RemoveNoWordCharactersConverter.class, SortConverter.class } ) public String testFile; Bei nur einem angegebenen Konverter können die geschweiften Klammern sogar entfallen: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", converter = RemoveNoWordCharactersConverter.class ) 1273 18 1507.book Seite 1274 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Hinweis Da ein Attribut wieder eine Annotation sein kann, ergeben sich interessante Möglichkeiten. Neben wir an, der Annotationstyp Name speichert Vor- und Nachnamen: @interface Name { String firstname(); String lastname(); } Ein Annotationstyp Author soll Name als Elementtyp für value nutzen: @interface Author { Name[] value(); } Vor Name steht nicht das @-Zeichen. Nur in der Anwendung: @Author( @Name( firstname = "Christian", lastname = "Ullenboom" ) ) Hätten wir das Element nicht value, sondern etwa name genannt, müsste die Angabe so heißen: name = @Name( firstname = "Christian", lastname = "Ullenboom" ) Und hätten wir mehrere Autoren angegeben, würden wir Folgendes schreiben: @Author( { @Name( firstname = "Christian", lastname = "Ullenboom" ), @Name( firstname = "Hansi", lastname = "Hinterweltler" ) } ) 18.5.7 Vorbelegte Attribute Im bisherigen Fall mussten alle Attributbelegungen angegeben werden, und wir konnten kein Element-Werte-Paar auslassen. Die Annotationstypen ermöglichen allerdings für Attribute Standardwerte, sodass ein Wert angeben werden kann, aber nicht muss. Statt @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", trim = false ) 1274 1507.book Seite 1275 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * soll es möglich sein, trim = false wegzulasssen, weil es Standard sein soll: @UrlResource( value = "http://tutego.de/aufgaben/bond.txt" ) Beziehungsweise dann wieder kürzer: @UrlResource( "http://tutego.de/aufgaben/bond.txt" ) In der Syntax für Vorbelegungen hält dafür das Schlüsselwort default her, was auch zu einer neuen Schreibweise führt, die von den Schnittstellen abweicht. Bei unserem @UrlResource ist nur die Angabe der Textquelle vonnöten; alles andere soll mit Default-Werten belegt sein: public @interface UrlResource { enum UpperLowerCase { UNCHANGED, LOWERCASE, UPPERCASE } String value(); boolean trim() default false; UpperLowerCase upperLowerCase() default UpperLowerCase.UNCHANGED; Class<? extends ResourceConverter>[] converter() default { }; } Nachträgliche Änderung und die Sinnhaftigkeit von Standardwerten 18 Annotationstypen können ebenso wenig einfach geändert werden wie Schnittstellendeklarationen. Wird eine Methode nie über den Basistyp einer Schnittstelle aufgerufen, sondern die Schnittstelle lediglich implementiert, so kann diese ungenutzte Operation im Prinzip gelöscht werden3. Bei Annotationen ist das genauso: Wenn ein Annotationselement mit einem Standardwert belegt ist, und es nie genutzt wird, kann es gelöscht werden. Aber hier gilt analog zu den Schnittstellen: Gibt es eine dynamische Bindung über eine Schnittstelle und werden die Operationen entfernt, so gibt es genauso einen Compilerfehler, wie wenn es einen Zugriff auf ein Annotationselement gibt, und es dann gelöscht wird. Auch das Ändern von Elementtypen führt im Allgemeinen zu Compilerfehlern, denn wenn aus einem int plötzlich ein String wird, fehlen Anführungszeichen. Standardwerte sind für Annotationen ein sehr wichtiges Instrument, um neue Annotationselemente schmerzfrei einzuführen. Werden neue Elemente in bestehende Annotationstypen eingefügt, dann müssten alle existierenden konkreten Annotationen das neue Element set- 3 Es sei denn, es wird seit Java 6 die Annotation @Override für die implementierten Methoden verwendet. 1275 1507.book Seite 1276 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen zen, was eine sehr große Änderung ist, vergleichbar einer neuen Operation in einer Schnittstelle. Anders als bei Schnittstellen lösen Default-Werte das Problem, da auf diese Weise für das neue Element immer gleich ein Wert vorhanden ist, der, sofern erwünscht, neu belegt werden kann. Ohne Probleme ist es möglich, einen Default-Wert hinzuzunehmen, während das Entfernen von Standardwerten wiederum kritisch ist. 18.5.8 Annotieren von Annotationstypen Von den in Java 5 eingeführten Annotationen haben wir die drei Typen aus dem Paket java.lang schon kennengelernt. Die restlichen vier Annotationen aus dem Paket java.lang.annotation dienen dazu, Annotationstypen zu annotieren. In diesem Fall wird von Meta-Annotationen gesprochen. Annotation Beschreibung @Target Was lässt sich annotieren? Klasse, Methode ...? @Retention Wo ist die Annotation sichtbar? Nur für den Compiler oder auch für die Laufzeitumgebung? @Documented Zeigt den Wunsch an, die Annotation in der Dokumentation zu erwähnen. @Inherited Macht deutlich, dass ein annotiertes Element auch in der Unterklasse annotiert ist. Tabelle 18.2: Meta-Annotationen @Target Die Annotation @Target beschreibt, wo eine Annotation angeheftet werden kann. Ist kein ausdrückliches @Target gewählt, gilt es für alle Elemente. Die Aufzählung java.lang.annotation.ElementType deklariert die folgenden Ziele: ElementType Erlaubt Annotationen ... ANNOTATION_TYPE an anderen Annotationstypen, was @Target(ANNOTATION_TYPE) somit zu einer Meta-Annotation macht. TYPE an allen Typdeklarationen, also Klassen, Schnittstellen, Aufzählungen. CONSTRUCTOR an Konstruktoren. Tabelle 18.3: ElementType bestimmt Orte, an denen Annotationen erlaubt sind. 1276 1507.book Seite 1277 Mittwoch, 12. Oktober 2011 12:49 12 18.5 ElementType Erlaubt Annotationen ... METHOD an statischen und nicht-statischen Methoden. FIELD an statischen Variablen und Objekt-Variablen. PARAMETER an Parametervariablen. LOCAL_VARIABLE an lokalen Variablen. PACKAGE an package-Deklarationen. Eigene Annotationstypen * Tabelle 18.3: ElementType bestimmt Orte, an denen Annotationen erlaubt sind. (Forts.) Soll eine Annotation etwa vor beliebigen Typen, Methoden, Paketen und Konstruktoren erlaubt sein, so setzen wir Folgendes an die Deklaration der Annotation: @Target( { TYPE, METHOD, CONSTRUCTOR, PACKAGE } ) public @interface ... Unsere eigenen drei Annotationstypen sind nur für Attribute sinnvoll. So nutzen wir FIELD, was hier an CurrentDateResource gezeigt wird: @Target( java.lang.annotation.ElementType.FIELD ) public @interface CurrentDateResource { } Hinweis Soll statt ElementType.FIELD einfach nur FIELD verwendet werden, so muss FIELD entsprechend aus ElementType statisch eingebunden werden. Damit ist folgender Programmcode eine Alternative: import static java.lang.annotation.ElementType.*; import java.lang.annotation.Target; @Target( FIELD ) public @interface CurrentDateResource { } Mit ElementType.TYPE ist die Annotation vor allen Typen – Klassen, Schnittstellen, Annotationen, Enums – erlaubt. Eine Einschränkung, etwa nur auf Klassen, ist nicht möglich. Interessant ist die Tatsache, dass eine Unterteilung für Methoden und Konstruktoren möglich ist und dass sogar lokale Variablen annotiert werden können. 1277 18 1507.book Seite 1278 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Beispiel Beim existierenden Annotationstyp @Override ist die Annotation @Target schön zu erkennen: @Target( value = METHOD ) public @interface Override Die Idee der Meta-Annotation: Es gibt nur überschriebene Methoden. Annotationen für Pakete sind speziell, weil sich die Frage stellt, wo hier die Metadaten über ein Paket stehen sollen. Eine Klasse selbst wird ja einem Paket zugeordnet – sollte das heißen, in irgendeiner wahllosen Typdeklaration stehen dann an der package-Deklaration die MetaAnnotationen für das Paket? Nein, denn dann würde zum einen die Annotation bei vielen Typen vielleicht nie mehr wiedergefunden, und zum anderen gäbe es bestimmt Konflikte, wenn aus Versehen an zwei Typen widersprüchliche Annotationen an der package-Deklaration stünden. Java wählt eine andere Lösung. Es muss eine Datei mit dem Namen packageinfo.java im jeweiligen Paket stehen, und dort darf die package-Deklaration annotiert sein. Da der Dateiname schon kein Klassenname sein kann (Minuszeichen sind nicht erlaubt), wird die Datei auch keine Typdeklaration enthalten, aber der Compiler erzeugt natürlich eine .classDatei für die Metadaten des Pakets. Kommentare sind selbstverständlich erlaubt, und die Datei wurde auch schon vor Java 5 für die API-Dokumentation eines Pakets verwendet. Dazu ein Beispiel. Ein neuer Annotationstyp AutomaticUmlDiagram soll deklariert werden, und er soll nur an Paketen gültig sein: Listing 18.22: com/tutego/insel/annotation/AutomaticUmlDiagram.java package com.tutego.insel.annotation; import java.lang.annotation.*; @Target( value = ElementType.PACKAGE ) public @interface AutomaticUmlDiagram {} Das Paket com.tutego.insel.annotation soll nun mit AutomaticUmlDiagram annotiert werden: Listing 18.23: com/tutego/insel/annotation/package-info.java @AutomaticUmlDiagram package com.tutego.insel.annotation; Die Datei package-info.java ist schlank, wird aber in der Regel größer sein, da sie das JavaDoc des Pakets enthält. 1278 1507.book Seite 1279 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * @Retention Die Annotation @Retention steuert, wer die Annotation sehen kann. Es gibt drei Typen, die in der Aufzählung java.lang.annotation.RetentionPolicy genannt sind: Þ SOURCE: Nützlich für Tools, die den Quellcode analysieren, aber die Annotationen werden vom Compiler verworfen, sodass sie nicht den Weg in den Bytecode finden. Þ CLASS: Die Annotationen speichert der Compiler in der Klassendatei, aber sie werden nicht in die Laufzeitumgebung gebracht. Þ RUNTIME: Die Annotationen werden in der Klassendatei gespeichert und sind zur Laufzeit in der JVM verfügbar. Die Unterscheidung haben die Java-Designer vorgesehen, da nicht automatisch jede Annotation zur Laufzeit verfügbar ist (eine Begründung: andernfalls würde es den Ressourcenverbrauch erhöhen). Der Standard ist RetentionPolicy.CLASS. Beispiel Der Annotationstyp @Deprecated ist nur für den Compiler und nicht für die Laufzeit von Interesse: @Retention( value = SOURCE ) public @interface Deprecated Ist ein Element mit @Target annotiert, so soll diese Information auch zur Laufzeit vorliegen: @Retention( value = RUNTIME ) 18 @Target( value = ANNOTATION_TYPE ) public @interface Target Das Beispiel zeigt, dass die Anwendung auch rekursiv sein kann (natürlich auch indirekt rekursiv, denn nicht nur @Retention annotiert @Target, auch @Target annotiert @Retention). Für den Zugriff auf die Annotationen gibt es dann, je nach Retention-Typ, unterschiedliche Varianten. Im Fall von Source ist es ein Tool, das auf Textebene arbeitet, also etwa ein Compiler oder ein statisches Analysetool, das Quellcode analysiert. Sind die Annotationen im Bytecode abgelegt, so lassen sie sich über ein Werkzeug beziehungsweise eine Bibliothek auslesen. Zwei Wege sind möglich: zunächst über die Pluggable Annotation Processing API und dann über rohe Tools, die direkt auf der Ebene vom Bytecode arbeiten. Im ersten Fall gibt es eine eigene API, die das Erfragen einfach macht. Die zweite Lösung sind Bytecode-Bibliotheken, wie etwa ASM (unter http://asm.ow2.org/), die alles auslesen können, was in der Klassendatei 1279 1507.book Seite 1280 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen steht, also auch die Annotationen. Sie sind aber proprietär und nicht einfach zu nutzen. Die dritte Variante ist einfach, da hier Reflection eine Möglichkeit bietet. Das schauen wir uns gleich im Anschluss in Abschnitt 18.5.10, »Annotierte Elemente auslesen«, an. @Documented Die Annotation @Documented zeigt an, dass die Annotation in der API-Dokumentation genannt werden soll. Alle Standard-Annotationen von Java werden so angezeigt, auch @Documented selbst. In der API-Dokumentation ist für die Annotationen ein neues Segment vorgesehen. Beispiel @Documented ist selbst @Documented: @Documented @Target( value = ANNOTATION_TYPE ) public @interface Documented 18.5.9 Deklarationen für unsere Ressourcen-Annotationen Da unsere drei Annotationen zur Laufzeit ausgelesen werden sollen, muss die @Retention mit RetentionPolicy.RUNTIME gesetzt sein. Damit sind unsere Annotationstypen vollständig, und der Quellcode soll an dieser Stelle aufgeführt werden. Der einfachste Annotationstyp war CurrentDateResource: Listing 18.24: com/tutego/insel/annotation/CurrentDateResource.java, CurrentDateResource @Documented @Target( ElementType.FIELD ) @Retention( RetentionPolicy.RUNTIME ) public @interface CurrentDateResource { } Der Annotationstyp ListOfFilesResource erwartet eine Pfadangabe, ist aber nicht deutlich komplexer als CurrentDateResource: Listing 18.25: com/tutego/insel/annotation/ListOfFilesResource.java, ListOfFilesResource @Documented @Target( ElementType.FIELD ) @Retention( RetentionPolicy.RUNTIME ) public @interface ListOfFilesResource 1280 1507.book Seite 1281 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * { String value(); } Und zu guter Letzt: Der Annotationstyp UrlResource hat am meisten zu bieten. Doch beginnen wir zunächst mit der Deklaration der Schnittstelle für die Konverter: Listing 18.26: com/tutego/insel/annotation/ResourceConverter.java, ResourceConverter public interface ResourceConverter { String convert( String input ); } Zwei Implementierungen sollen für das Beispiel genügen: Listing 18.27: com/tutego/insel/annotation/SortConverter.java, SortConverter public class RemoveNoWordCharactersConverter implements ResourceConverter { @Override public String convert( String input ) { return input.replaceAll( "\\W", "" ); } } 18 Listing 18.28: com/tutego/insel/annotation/SortConverter.java, SortConverter public class SortConverter implements ResourceConverter { @Override public String convert( String input ) { char[] chars = input.toCharArray(); Arrays.sort( chars ); return new String( chars ); } } Damit kann dann der letzte Annotationstyp übersetzt werden: Listing 18.29: com/tutego/insel/annotation/UrlResource.java, UrlResource @Documented @Target( ElementType.FIELD ) 1281 1507.book Seite 1282 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen @Retention( RetentionPolicy.RUNTIME ) public @interface UrlResource { enum UpperLowerCase { UNCHANGED, LOWERCASE, UPPERCASE } String value(); boolean trim() default false; UpperLowerCase upperLowerCase() default UpperLowerCase.UNCHANGED; Class<? extends ResourceConverter>[] converter() default { }; } 18.5.10 Annotierte Elemente auslesen Ob eine Klasse annotiert ist, erfragt ganz einfach die Methode isAnnotationPresent() auf dem Class-Objekt: println( String.class.isAnnotationPresent( Deprecated.class ) ); // false println( StringBufferInputStream.class.isAnnotationPresent( Deprecated.class ) ); // true Da unterschiedliche Dinge annotierbar sind, schreibt eine Schnittstelle AnnotatedElement für die Klassen Class, Constructor, Field, Method, Package und AccessibleObject folgende Operationen vor: interface java.lang.reflect.AnnotatedElement Þ <T extends Annotation> T getAnnotation(Class<T> annotationType) Liefert die Annotation für einen bestimmten Typ. Ist sie nicht vorhanden, dann ist die Rückgabe null. Der generische Typ ist bei der Rückgabe hilfreich. Denn das Argument ist ein Class-Objekt, das den Annotationstyp repräsentiert. Die Rückgabe ist genau die konkrete Annotation für das annotierte Element. Þ boolean isAnnotationPresent(Class<? extends Annotation> annotationType) Gibt es die angegebene Annotation? Þ Annotation[] getAnnotations() Liefert die an dem Element festgemachten Annotationen. Gibt es keine Annotation, ist das Feld leer. Die Methode liefert auch Annotationen, die aus den Oberklassen kommen. Þ Annotation[] getDeclaredAnnotations() Liefert die Annotationen, die exakt an diesem Element festgemacht sind. 1282 1507.book Seite 1283 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * Um die Annotationen etwa von Variablen oder Methoden zu erfragen, ist ein wenig Reflection-Wissen nötig. Ist obj ein Objekt, so findet folgende Schleife alle mit CurrentDateResource annotierten Objektvariablen und gibt eine Meldung aus: for ( Field field : obj.getFields() ) if ( field.isAnnotationPresent( CurrentDateResource.class ) ) System.out.println( "CurrentDateResource gesetzt" ); 18.5.11 Auf die Annotationsattribute zugreifen Um auf die einzelnen Attribute einer Annotation zuzugreifen, müssen wir etwas mehr über die Umsetzung einer Annotation von Compiler und der JVM wissen. Übersetzt der Compiler einen Annotationstyp, generiert er daraus eine Schnittstelle. Beispiel Für den Annotationstyp ListOfFilesResource generiert der Compiler: import java.lang.annotation.Annotation; public interface ListOfFilesResource extends Annotation { public abstract String value(); } 18 Rufen wir auf einem AnnotatedElement, etwa Field, eine Methode wie getAnnotation() auf, bekommen wir ein Objekt, das Zugriff auf unsere Element-Werte-Paare liefert. Denn zur Laufzeit werden über java.lang.reflect.Proxy Objekte gebaut, die unsere Schnittstelle – das ist ListOfFilesResource – implementiert und so die Methode value() anbietet. Hinweis Die Annotation ist zur Laufzeit ein Proxy-Objekt, und daher kann der Annotationstyp keine eigene Klasse erweitern und auch keine anderen eigenen Schnittstellen implementieren. Ein Annotationstyp kann auch keine anderen Annotationstypen erweitern. Es könnte eine eigene Klasse zwar die Schnittstelle java.lang.annotation.Annotation implementieren, doch entsteht dadurch keine echte Annotation, was den Versuch sinnlos macht. Testen wir die Möglichkeit, indem wir zwei annotierte Variablen in eine Klasse setzen und dann per Reflection über alle Variablen laufen und alle Annotationen erfragen lassen: 1283 1507.book Seite 1284 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen Listing 18.30: com/tutego/insel/annotation/GetTheUrlResourceValues.java, GetTheUrlResourceValues public class GetTheUrlResourceValues { @UrlResource( value = "http://tutego.de/aufgaben/bond.txt", upperLowerCase = UpperLowerCase.UPPERCASE, trim = true, converter = { RemoveNoWordCharactersConverter.class, SortConverter.class } ) public String testFile; @XmlValue @Deprecated public String xmlValue; public static void main( String[] args ) throws Exception { for ( Field field : GetTheUrlResourceValues.class.getFields() ) for ( Annotation a : field.getAnnotations() ) System.out.println( a ); } } Die Ausgabe zeigt drei Annotationen: @com.tutego.insel.annotation.UrlResource(converter=[class com.tutego.insel.annotation.ð RemoveNoWordCharactersConverter, class com.tutego.insel.annotation.SortConverter], ð trim=true, upperLowerCase=UPPERCASE, value=http://tutego.de/aufgaben/bond.txt) @javax.xml.bind.annotation.XmlValue() @java.lang.Deprecated() Die Default-Werte werden zur Laufzeit gesetzt. 18.5.12 Komplettbeispiel zum Initialisieren von Ressourcen Zusammenfassend können wir jetzt eine Klasse vorstellen, die tatsächlich die mit den Ressourcen-Annotationen versehenen Variablen mit sinnvollem Inhalt füllt. Zunächst betrachten wir ein Beispiel, das die Nutzung einer solchen Klasse aufzeigt. Die Klasse Resources bildet den Rahmen für Objekte, die automatisch aufgebaut und korrekt initialisiert werden sollen: 1284 1507.book Seite 1285 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * Listing 18.31: com/tutego/insel/annotation/AnnotatedResourceExample.java, Resources class Resources { @CurrentDateResource() public Date now; @ListOfFilesResource( value = "c:/" ) public String[] files; @UrlResource( "http://tutego.de/aufgaben/bond.txt" ) public String testFile; } Einer zweiten Klasse geben wir ein main() und setzen dort die Aufforderung, ein Objekt vom Typ Resources anzulegen und zu initialisieren: Listing 18.32: com/tutego/insel/annotation/AnnotatedResourceExample.java, AnnotatedResourceExample public class AnnotatedResourceExample { public static void main( String[] args ) { Resources resources = 18 ResourceReader.getInitializedResourcesFor( Resources.class ); System.out.println( resources.now ); System.out.println( Arrays.toString( resources.files ) ); System.out.println( resources.testFile ); } } Kommen wir zum Herzen, der Klasse ResourceReader: Listing 18.33: com/tutego/insel/annotation/ResourceReader.java, ResourceReader package com.tutego.insel.annotation; import java.io.File; import java.lang.reflect.Field; import java.net.URL; import java.util.Date; 1285 1507.book Seite 1286 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen import java.util.Scanner; public class ResourceReader { public static <T> T getInitializedResourcesFor( Class<T> ressources ) { try { T newInstance = ressources.newInstance(); for ( Field field : ressources.getFields() ) { if ( field.isAnnotationPresent( CurrentDateResource.class ) ) field.set( newInstance, new Date() ); else if ( field.isAnnotationPresent( ListOfFilesResource.class ) ) field.set( newInstance, new File(field.getAnnotation( ListOfFilesResource.class ).value().toString()).list() ); else if ( field.isAnnotationPresent( UrlResource.class ) ) { String url = field.getAnnotation( UrlResource.class ).value(); String content = new Scanner( new URL(url).openStream() ) .useDelimiter( "\\z" ).next(); if ( field.getAnnotation( UrlResource.class ).trim() ) content = content.trim(); switch ( field.getAnnotation( UrlResource.class ).upperLowerCase() ) { case UPPERCASE: content = content.toUpperCase(); break; case LOWERCASE: content = content.toLowerCase(); break; default: // Nichts zu tun } Class<? extends ResourceConverter>[] converterClasses = field.getAnnotation( UrlResource.class ).converter(); for ( Class<? extends ResourceConverter> converterClass : converterClasses ) content = converterClass.newInstance().convert( content ); 1286 1507.book Seite 1287 Mittwoch, 12. Oktober 2011 12:49 12 18.5 Eigene Annotationstypen * field.set( newInstance, content ); } } return newInstance; } catch ( Exception e ) { return null; } } } An den folgenden Anweisungen ist das Prinzip gut ablesbar: T newInstance = ressources.newInstance(); for ( Field field : ressources.getFields() ) if ( field.isAnnotationPresent( CurrentDateResource.class ) ) field.set( newInstance, new Date() ); Zunächst wird ein neues Exemplar, ein Behälter, aufgebaut. Dann läuft eine Schleife über alle Variablen. Gibt es zum Beispiel die Annotation CurrentDateResource an einer Variablen, so wird ein Date-Objekt aufgebaut und mit set() die Variable mit dem Datum initialisiert. 18.5.13 Mögliche Nachteile von Annotationen Annotationen sind eine gewaltige Neuerung und sicherlich die wichtigste seit vielen Java-Jahren. Auch wenn die Generics auf den ersten Blick bedeutsam erscheinen, sind die Annotationen ein ganz neuer Schritt in die deklarative Programmierung, wie sie Frameworks schon heute aufzeigen. Völlig problemlos sind Annotationen allerdings nicht, und so müssen wir etwas Wasser in den Wein gießen: Þ Die Annotationen sind stark mit dem Quellcode verbunden, können also auch nur dort ge- ändert werden. Ist der Original-Quellcode nicht verfügbar, etwa weil der Auftraggeber ihn geschlossen hält, ist eine Änderung der Werte nahezu unmöglich. Þ Wenn Annotationen allerdings nach der Übersetzung nicht mehr geändert werden kön- nen, stellt das bei externen Konfigurationsdateien kein Problem dar. Externe Konfigurationsdateien können ebenso den Vorteil bieten, dass die relevanten Informationen auf 1287 18 1507.book Seite 1288 Mittwoch, 12. Oktober 2011 12:49 12 18 Reflection und Annotationen einen Blick erfassbar sind und sich mitunter nicht redundant auf unterschiedliche JavaKlassen verteilen. Þ Klassen mit Annotationen sind invasiv und binden auch die Implementierungen an einen gewissen Typ, wie es Schnittstellen tun. Sind die Annotationstypen nicht im Klassenpfad, kommt es zu einem Compilerfehler. Þ Bisher gibt es keine Vererbung von Annotationen: Ein Annotationstyp kann keinen ande- ren Annotationstyp erweitern. Þ Die bei den Annotationen gesetzten Werte lassen sich zur Laufzeit erfragen, aber nicht mo- difizieren. Þ Warum werden Annotationen mit @interface deklariert, einer Schreibweise, die in Java sonst völlig unbekannt ist? Ein Problem gibt es allerdings nur bei finalen statischen Variablen (Konstanten), das bei den Default-Werten der Annotationen nicht vorkommt: Weil die Default-Werte zur Laufzeit gesetzt werden, lassen sie sich in der Deklaration vom Annotationstyp leicht ändern, und eine Neuübersetzung des Projekts kann somit unterbleiben. Zur Ehrenrettung sei erwähnt, dass moderne Frameworks wie JPA oder JSF 2 aus dem Java EEStandard immer noch den Einsatz von XML vorsehen. So lässt sich auf Annotationen verzichten bzw. XML einsetzen, sodass Zuweisungen aus den Annotationen überschrieben werden können. 18.6 Zum Weiterlesen Reflection ist ein mächtiges Werkzeug, aber wie alle Werkzeuge kann es leicht missbraucht werden. Oftmals wird in der Softwareentwicklung eine weitere Zwischenschicht zur Abstraktion gezogen und alles generisch gehalten – die Konsequenz ist unwartbare Software. Die Bedeutung von Annotationen wurde am Anfang sicherlich unterschätzt, aber mittlerweile sind sie ein unverzichtbares Sprachmittel. Leser können die Möglichkeiten an folgenden Frameworks ablesen: args4j (https://args4j.dev.java.net/), JPA, EJB 3.0, JAXB, JSefa (http:// jsefa.sourceforge.net/). Mit der Pluggable Annotation Processing API lassen sich interessante Lösungen erzielen, etwa auf den internen AST vom Java-Compiler zugreifen; zwei sehr kreative Lösungen zeigt http://tutego.de/go/beyond269/ auf. 1288 1507.book Seite 1411 Mittwoch, 12. Oktober 2011 12:49 12 Index Index #IMPLIED ............................................................. 538 @XmlElementRef, Annotation ..................... 565 #REQUIRED ......................................................... 538 @XmlElementRefs, Annotation ................... 565 %tD ......................................................................... 346 @XmlElementWrapper, Annotation ........... 560 %tR ......................................................................... 346 @XmlJavaTypeAdapter, Annotation ........... 561 %tT ......................................................................... 346 @XmlList, Annotation ..................................... 559 &amp ..................................................................... 534 @XmlRootElement, Annotation ......... 549, 564 &apos .................................................................... 534 @XmlType, Annotation .................................. 558 &gt .......................................................................... 534 @XmlValue, Annotation ................................ 559 &lt ........................................................................... 534 [L ........................................................................... 1234 &quot .................................................................... 534 1.1.1970 ................................................................ 307 , Ant ..................................................................... 1344 1099, Port rmiregistry .................................... 1046 .class .................................................................... 1229 200, OK HTTP-Statuscode ............................. 1004 .java.policy ........................................................ 1364 404, Not Found HTTP-Statuscode ............... 1004 .keystore ............................................................ 1369 80, HTTP-Port ..................................................... 999 .NET Remoting ................................................. 1037 8080, HTTP-Port ................................................. 999 @CookieParam, Annotation ....................... 1070 @deprecated .................................................... 1227 A @Documented, Annotation ........................ 1280 @GET, Annotation ......................................... 1062 Abstract Syntax Notation One .................... 1369 @Inject, Annotation ...................................... 1225 AbstractAction, Klasse ..................................... 695 @javax.management.MXBean, AbstractBorder, Klasse ..................................... 699 Annotation ................................................... 1332 AbstractButton, Klasse .................................... 680 @NotNull, Annotation .................................. 1208 AbstractTableModel, Klasse ........................... 792 @OneWay, Annotation ................................. 1074 Accelerator .......................................................... 753 @Override, Annotation ................................ 1268 accept(), ServerSocket ...................................... 990 @Path, Annotation ........................................ 1062 Access Controller ............................................. 1355 @PathParam, Annotation ............................ 1069 Accessible, Schnittstelle .................................. 854 @Produces, Annotation ............................... 1062 AccessibleObject, Klasse ..................... 1244, 1262 @QueryParam, Annotation ......................... 1070 Action, Schnittstelle ................................ 695, 751 @Retention, Annotation .............................. 1279 ACTION_PERFORMED, ActionEvent ............ 674 @SOAPBinding, Annotation ....................... 1074 Action-Command .............................................. 682 @SuppressWarnings, Annotation ............. 1268 ActionListener, Schnittstelle ....... 662, 676, 678 @Target, Annotation ..................................... 1276 Activatable, Klasse .......................................... 1055 @Transient, Annotation ................................. 558 Activation Daemon ........................................ 1055 @WebMethod, Annotation ......................... 1074 activation.jar ..................................................... 1021 @WebParam, Annotation ............................ 1074 Adapter ................................................................. 201 @WebResult, Annotation ............................ 1074 Adapter, MBean ............................................... 1325 @WebService, Annotation ........................... 1074 Adapterklasse ..................................................... 668 @XmlAccessorType, Annotation .................. 557 add(), Container ........................................ 653, 697 @XmlAttribute, Annotation .......................... 558 addActionListener(), JButton ......................... 678 @XmlElement, Annotation ............................ 551 addItem(), JComboBox .................................... 776 1411 1507.book Seite 1412 Mittwoch, 12. Oktober 2011 12:49 12 Index addKeyListener(), Component ...................... 703 Ära .......................................................................... 350 addWindowListener() ....................................... 666 Arc2D, Klasse .............................................. 888–889 Adjustable, Schnittstelle ................................. 736 Area, Klasse .......................................................... 890 AdjustmentEvent, Klasse ................................ 734 AreaAveragingScaleFilter ................................ 929 AdjustmentListener, Schnittstelle ............... 737 ARM-Block ............................................................. 51 Adleman, Leonard M. ..................................... 1371 Array, Klasse ..................................................... 1240 Adler32, Klasse ................................................... 502 ArrayBlockingQueue, Klasse .......................... 287 Adobe Flash ....................................................... 1124 ArrayDeque, Klasse ........................................... 222 Affine Transformation .................................... 941 ArrayList, Klasse ............. 176, 183, 185, 188, 197 AffineTransform, Klasse .................................. 942 ArrayStoreException ........................................ 205 Age, Response-Header ................................... 1005 Artefakte ............................................................... 932 AIFF ........................................................................ 641 Aschermittwoch ................................................. 326 Al-Chwârismî, Ibn Mûsâ .................................. 175 asList(), Arrays ........................................... 201, 265 AlgorithmParameterSpec, Schnittstelle ... 1376 ASM ..................................................................... 1279 Algorithmus ........................................................ 175 ASN.1 .................................................................. 1369 -alias .................................................................... 1369 ASP (Active Server Pages) ............................. 1080 Allgemeines Semaphor ................................... 139 Assistive technology ......................................... 854 allowSystemProperty ..................................... 1365 Assoziativer Speicher ....................................... 184 AllPermission ................................................... 1366 asSubclass(), Class ........................................... 1268 AlphaComposite, Klasse .................................. 907 Astronomie .......................................................... 305 AlreadyBoundException ............................... 1049 Atomar .................................................................... 99 AM_PM, Calendar .............................................. 329 Atomuhr ............................................................... 306 Anmelde-/Versendesystem ......................... 1055 Attribute ............................................................... 533 AnnotatedElement, Schnittstelle .... 1253, 1282 AU ........................................................................... 641 Annotiert ........................................................... 1228 AudioClip, Klasse ............................................... 640 Ant ....................................................................... 1393 AUGUST, Calendar ............................................. 323 Antialiasing ................................................ 871, 941 Ausgabeformatierung ...................................... 306 ANY ........................................................................ 537 Auswahlmenü ..................................................... 775 Apache Commons BeanUtils ....................... 1262 Auszeichnungssprache ........................... 531, 617 Apache Commons Collections ...................... 304 authentication required ............................... 1008 Apache Commons Compress ......................... 626 Authenticator, Klasse ....................................... 971 Apache Commons DBCP ............................... 1198 Authentifizierung ........................................... 1367 Apache Commons IO ............................... 368, 434 Auto-Commit ................................................... 1190 Apache Commons Logging ........................... 1323 Automatic Resource Management (ARM) .... 51 Apache Commons Net ..................................... 998 Automatischer Bildlauf .................................... 714 Apache Commons Primitives ........................ 208 Autorisierung .................................................. 1367 Apache CXF ........................................................ 1073 await(), Condition .............................................. 125 Apache POI .......................................................... 622 AWTEvent, Klasse .............................................. 673 Appendable, Schnittstelle ............................... 451 AWTEventListener, Schnittstelle ................... 854 Apple, Look and Feel ......................................... 832 AWT-Event-Thread ................................... 672, 844 Applet ................................................................. 1125 AWT-Input ............................................................. 78 AppletContext ......................................... 641, 1129 AWT-Motif ............................................................. 78 APRIL, Calendar .................................................. 323 Axis2 ................................................................... 1073 1412 1507.book Seite 1413 Mittwoch, 12. Oktober 2011 12:49 12 Index B BufferedReader, Klasse ........................... 439, 471 BufferedWriter ................................................... 469 barrier ................................................................... 143 build.xml ........................................................... 1394 Base64-Encoding ............................................. 1020 ButtonGroup, Klasse ........................................ 743 Baseline ................................................................. 877 ByteArrayInputStream, Klasse ...................... 467 BasicFileAttributes, Schnittstelle ......... 398–399 ByteArrayOutputStream, Klasse ................... 467 BasicFileAttributeView, ByteBuffer, Klasse ............................................. 423 Schnittstelle ........................................... 397, 403 Bytecode Verifier ............................................. 1355 BasicStroke, Klasse ............................................ 908 BZip2 ............................................................ 625–626 BatchUpdateException ................................. 1177 Bean Validation ............................................... 1207 beans.xml .......................................................... 1225 C Bean-Zustände kopieren ............................... 1262 Cache, Bilder ....................................................... 934 Beautifier ........................................................... 1408 Cache-Control ................................................... 1004 Berkeley-Socket-Interface ............................... 983 CachedRowSet, Schnittstelle ........................ 1183 Berners-Lee, Tim ................................................ 998 CAG (Constructive Area Geometry) ............. 891 BevelBorder, Klasse ........................................... 699 Calendar, Klasse ........................................ 306, 320 Bézier-Kurve ........................................................ 890 Callable, Schnittstelle ......................................... 93 Bilder skalieren ................................................... 927 CallableStatement, Schnittstelle ................. 1168 Bildlaufleiste ....................................................... 733 Canvas .................................................................. 913 Binäre Suche (binary search) .......................... 278 CAP_BUTT, BasicStroke ................................... 909 Binäres Semaphor ............................................. 139 CAP_ROUND, BasicStroke ...................... 909, 912 Binärsystem .......................................................... 41 CAP_SQUARE, BasicStroke .............................. 909 binarySearch(), Arrays ...................................... 264 CardLayout, Klasse ............................................ 717 bind(), Registry ................................................ 1048 Caret ...................................................................... 685 Biometrisches System ................................... 1368 CASE_INSENSITIVE_ORDER, String .............. 265 Birrel ................................................................... 1035 CDATA ................................................................... 537 Bitmenge .............................................................. 299 CDI ....................................................................... 1224 BitSet, Klasse ....................................................... 299 CERN ...................................................................... 998 Bitttage .................................................................. 326 Certificate Authority, CA ............................... 1368 Bitweise Manipulation ..................................... 299 CET (Central European Time) ......................... 336 BlockingQueue, Schnittstelle ................ 223, 287 ChangeListener, Schnittstelle ........................ 733 Bootstrap Class Loader .................................. 1355 CharArrayReader, Klasse ................................. 465 Border, Schnittstelle ......................................... 699 CharArrayWriter, Klasse .................................. 464 BorderFactory, Klasse ....................................... 700 Checkbox, Klasse ............................................... 740 BorderLayout, Klasse ............................... 717, 721 checkError() ......................................................... 455 BoundedRangeModel, Schnittstelle ............. 734 Checksum, Schnittstelle .................................. 498 BoxLayout ............................................................ 732 choice box ........................................................... 775 BoxLayout, Klasse ..................................... 717, 720 Christi Himmelfahrt ......................................... 326 brighter(), Color .................................................. 901 Cipher, Klasse ................................................... 1377 Brightness ............................................................ 902 CipherInputStream, Klasse ........................... 1377 Bucket, Hash-Tabelle ........................................ 241 CipherOutputStream, Klasse ....................... 1377 BufferedImage, Klasse ...................................... 924 Class, Klasse ...................................................... 1228 BufferedInputStream, Klasse ................ 439, 471 class, Schlüsselwort ........................................ 1238 BufferedOutputStream .................................... 469 ClassLoader, Klasse ......................................... 1357 1413 1507.book Seite 1414 Mittwoch, 12. Oktober 2011 12:49 12 Index ClassNotFoundException ...... 1229–1230, 1242 Connector-Level .............................................. 1325 Client ................................................................... 1038 Constraints, Validierung .............................. 1208 Client, Klasse ..................................................... 1063 ConstraintValidator, Schnittstelle ............. 1217 ClientResponse, Klasse .................................. 1064 ConstraintViolation, Schnittstelle ............. 1209 Client-Server-Kommunikation ..................... 989 Constructor, Klasse ........................................ 1250 Clip-Bereich ......................................................... 867 Contact Port ........................................................ 984 Clipboard .................................................... 754, 836 Container ............................................................. 176 Clipboard, Klasse ............................................... 836 contains(), Shapre .............................................. 895 Clipper ................................................................ 1372 containsKey(), Map ........................................... 233 Clipping ................................................................ 896 Content Negotiation ...................................... 1067 Clipping-Bereich ................................................ 937 Content-Encoding .......................................... 1006 Closeable, Schnittstelle .................................... 443 Content-Handler ....................................... 965, 968 closePath(), Path2D ........................................... 894 ContentHandler, Schnittstelle ....................... 583 Cloudscape ........................................................ 1140 Content-Pane ...................................................... 646 Clustering, Hash-Tabelle ................................. 241 Contexts and Dependency Injection for Codebase ............................................................ 1363 the Java EE platform .................................. 1224 Codehaus XFire ................................................ 1073 Controller ............................................................. 765 Collator, Klasse ................................................... 266 CopyOnWriteArrayList, Klasse ............. 188, 285 Collection, Schnittstelle ......................... 176, 178 CopyOnWriteArraySet, Klasse ....................... 285 Collection-API .................................................... 175 CopyOption, Schnittstelle ............................... 395 Collections, Klasse ............................................ 176 CORBA (Common Object Request Broker Color, Klasse ........................................................ 897 Architecture) ..................................... 1037, 1053 com.sun.image.codec.jpeg, Paket ................. 915 CRC32, Klasse ...................................................... 500 com.sun.net.httpserver, Paket .................... 1006 createCompatibleImage(), com4j .................................................................. 1353 GraphicsConfiguration ................................ 923 ComboBoxModel, Schnittstelle .................... 775 createDirectories(), Files .................................. 407 Command Model ............................................... 662 createDirectory(), Files ..................................... 406 Component, Klasse ........................................... 697 createFile(), Files ................................................. 406 ComponentEvent, Klasse ................................ 674 createGraphics(), BufferedImage .................. 924 ComponentListener, Schnittstelle ............... 707 createRegistry(), LocateRegistry ................. 1045 ComponentUI, Klasse ....................................... 766 createStatement(), Connection ................... 1168 Composite Pattern ............................................ 697 createSymbolicLink(), Files ............................. 407 Composite, Schnittstelle ................................. 907 Crimson ................................................................ 546 CompoundBorder, Klasse ............................... 699 Cryptographic Service Provider ................. 1356 CONCUR_UPDATABLE, ResultSet .... 1176, 1184 CSV (Comma-separated Values) .................... 618 ConcurrentHashMap, Klasse ......................... 285 CubicCurve2D, Klasse ....................................... 888 ConcurrentLinkedQueue, Klasse .................. 285 currentThread(), Thread .................................... 72 ConcurrentMap, Schnittstelle ....................... 284 currentTimeMillis(), System ........................... 307 ConcurrentModificationException ............. 259 curveTo(), GeneralPath .................................... 891 ConcurrentSkipListMap, Klasse ........... 185, 285 Custom tag library .......................................... 1101 ConcurrentSkipListSet, Klasse ....................... 285 CXF, Apache ...................................................... 1073 Condition, Schnittstelle .................................. 125 cxxwrap ............................................................. 1352 Connection, Schnittstelle .................. 1004, 1159 CyberNeko ........................................................... 621 Connector/J ....................................................... 1142 CyclicBarrier, Klasse .......................................... 143 1414 1507.book Seite 1415 Mittwoch, 12. Oktober 2011 12:49 12 Index D Deadlock .............................................................. 119 DECEMBER, Calendar ....................................... 323 Dämon .................................................................... 76 Decompiler ........................................................ 1398 darker(), Color ..................................................... 901 default, Schlüsselwort .................................... 1275 Dash attribute ..................................................... 908 DefaultHandler, Klasse ........................... 583–584 Database Management System .................. 1139 DefaultListCellRenderer, Klasse .................... 774 DatabaseMetaData, Schnittstelle ............... 1194 DefaultListModel, Klasse ................................ 773 DataFlavor, Klasse ............................................. 838 DefaultListModel, Schnittstelle .................... 768 Datagramm ....................................................... 1012 DefaultMutableTreeNode, Klasse ................. 809 DatagramPacket, Klasse ................................ 1012 defaultReadObject(), ObjectInputStream ... 514 Datagram-Socket ............................................. 1010 DefaultTableCellRenderer, Klasse ................ 798 DatagramSocket, Klasse ..................... 1010, 1012 DefaultTableModel, Klasse ............................. 796 DataInput, Schnittstelle .......................... 383, 506 defaultWriteObject(), ObjectOutput- DataInputStream, Klasse ................................. 478 Stream .............................................................. 513 DataOutput, Schnittstelle ....................... 383, 506 Deflater, Klasse .................................................. 626 DataOutputStream, Klasse .............................. 478 Dekoration .......................................................... 649 DataSource ........................................................ 1195 Delegation Model .............................................. 662 DataSource, Schnittstelle ............................. 1195 delete(), Files ....................................................... 408 DatatypeFactory, Klasse .......................... 341, 562 DELETE, HTTP-Methode ................................ 1000 DATE, Calendar ................................................... 328 deleteIfExists(), Files ......................................... 408 Date, General Header Fields ........................ 1004 Dependency Injection .................................... 1221 Date, Klasse ................................................. 306, 317 Deployment-Descriptor ................................ 1087 DateFormat, Klasse ......................... 306, 346, 352 Deque .................................................................... 220 Dateiattribute ..................................................... 397 Deque, Schnittstelle ................................. 184, 222 Dateiauswahldialog .......................................... 823 Derby .................................................................. 1140 Dateiformat ......................................................... 617 Dereferenced-Meldung ................................. 1050 Dateisystem-Attribute ..................................... 397 deriveFont(), Font .............................................. 880 Dateiverknüpfung ............................................. 364 DES (Data Encryption Standard) ................. 1375 Datenbankausprägung .................................. 1140 Dezimalsystem .................................................... 41 Datenbankschema .......................................... 1140 DGC ...................................................................... 1050 Datenbankverbindung .................................. 1164 Dialog ........................................................... 818–819 Datenbankverwaltungssystem ................... 1139 Digitale Unterschrift ...................................... 1371 Datenbasis ........................................................ 1139 DirectoryNotEmptyException ...................... 408 Datenkompression ............................................ 624 DirectoryStream, Schnittstelle ...................... 410 Datenstrukturen ................................................ 175 DirectoryStream.Filter, Schnittstelle .......... 411 Datenzeiger ......................................................... 384 Direkte ByteBuffer ............................................ 423 Datumswerte ....................................................... 306 Distributed Component Object Model DAY_OF_MONTH, Calendar ........................... 328 (DCOM) .......................................................... 1037 DAY_OF_WEEK, Calendar ................................ 329 Distributed GC ................................................. 1050 DAY_OF_WEEK_IN_MONTH, Calendar ....... 329 divide and conquer ........................................... 149 DAY_OF_YEAR, Calendar ................................. 329 Divider .................................................................. 712 DB2 ...................................................................... 1143 -Djava.rmi.dgc.leaseValue ............................ 1050 dBase, JDBC ....................................................... 1155 -Djava.rmi.server.codebase .......................... 1053 DBMS .................................................................. 1139 -Djava.security.debug .................................... 1361 -Dcom.sun.management.jmxremote ....... 1329 -Djava.security.manager ............................... 1362 1415 1507.book Seite 1416 Mittwoch, 12. Oktober 2011 12:49 12 Index -Djava.security.policy .................................... 1364 Dynamischer Methodenaufruf ................... 1266 -Djdbc.drivers ................................................... 1160 Dynamisches Layout ........................................ 651 dll-Dateien ......................................................... 1343 DnD, Drag & Drop ............................................. 841 E DNS ........................................................... 1011, 1135 Doclet ....................................................... 1228, 1390 EBCDIC .................................................................. 491 DOCTYPE .............................................................. 539 Echozeichen ........................................................ 686 Document Object Model ................................. 545 EclipseLink ........................................................ 1201 Document Type Definition ............................ 535 ECML ................................................................... 1096 Document, Klasse .............................................. 590 Editor-Kit .............................................................. 692 DocumentBuilderFactory ............................... 547 eFace ...................................................................... 861 Dokumentenformat ......................................... 620 Electronic Commerce Modeling DOM ...................................................................... 545 Language ....................................................... 1096 DOM Level 3 XPath ........................................... 607 Element suchen ......................................... 278, 282 Domain Name Server ..................................... 1135 Element, Klasse .................................................. 594 Domain Name System ................................... 1011 Element, XML ...................................................... 533 Domain Specific Language (DSL) ................ 1289 ElementType, Aufzählung ............................ 1276 DOMBuilder, Klasse .......................................... 591 Ellipse2D, Klasse ................................................ 888 Doppel-Pufferung, Swing ................................ 712 EmptyBorder, Klasse ......................................... 699 DosFileAttributes, Schnittstelle .................... 399 EmptyStackException ...................................... 220 DosFileAttributeView, Schnittstelle ... 397, 403 End caps ................................................................ 909 Double-Buffering, Swing ................................. 712 Endpoint, Klasse .............................................. 1075 Dozer ................................................................... 1262 ENGLISH, Locale ................................................. 310 Drag & Drop ........................................................ 841 ensureCapacity(), List ....................................... 199 draw(Shape), Graphics2D ................................ 887 Entfernte Methoden ...................................... 1035 draw3DRect(), Graphics ................................... 901 Entfernte Methodenaufrufe ........................ 1035 drawImage(), Graphics ..................................... 917 Entfernte Objekte ........................................... 1042 drawLine(), Graphics ........................................ 871 Entität ................................................................... 534 drawString(), Graphics ..................................... 877 Entity .................................................................. 1005 Drehfeld ............................................................... 787 Entity-Beans ..................................................... 1199 DriverManager, Klasse ........................ 1160, 1163 Entity-Body ....................................................... 1005 Drucken ................................................................ 944 Entity-Header ........................................ 1002, 1005 DSAPrivateKeySpec, Klasse .......................... 1377 EntityResolver, Schnittstelle .......................... 583 DST_OFFSET, Calendar ..................................... 329 entrySet(), Map ................................................... 238 DTD ........................................................................ 535 Enumeration, Schnittstelle ............................. 260 DTDHandler, Schnittstelle .............................. 583 Enumerator ......................................................... 249 Duration, Klasse ....................................... 342, 563 EOFException ............................................. 382, 478 Durchschuss ....................................................... 884 ERA, Calendar ...................................................... 328 -Duser.timezone ................................................ 324 Ereignis, GUI ........................................................ 673 Dynamic invocation ....................................... 1264 Ereignisauslöser ................................................. 662 dynamic linked libraries ............................... 1343 Ereignisschlange ................................................ 844 Dynamic MBeans ............................................ 1325 ErrorHandler, Schnittstelle ............................. 583 Dynamische Datenstruktur ........................... 175 EtchedBorder, Klasse ........................................ 699 Dynamische Webseite ................................... 1079 Event Queue ........................................................ 844 Event-Dispatching-Thread .............................. 672 1416 1507.book Seite 1417 Mittwoch, 12. Oktober 2011 12:49 12 Index EventFilter, Schnittstelle ................................. 578 FileSystems, Klasse ........................................... 416 Eventquelle .......................................................... 662 FileTypeDetector, Klasse ................................. 409 EventQueue, Klasse ......................... 844, 849, 853 FileVisitOption, Aufzählung .......................... 415 Event-Source ....................................................... 662 FileVisitor, Schnittstelle .................................. 413 Excel-Dokumente .............................................. 623 FileVisitResult, Aufzählung ............................ 413 Exchanger, Klasse .............................................. 145 FileWriter, Klasse ............................................... 428 executeQuery(), Statement .......................... 1168 fill(), Collections ................................................. 280 executeUpdate(), Statement ........................ 1168 FilteredRowSet, Schnittstelle ....................... 1183 Executor, Schnittstelle ....................................... 89 FilterInputStream, Klasse ............................... 478 ExecutorService, Schnittstelle ......................... 90 FilterOutputStream, Klasse ............................ 478 EXIT_ON_CLOSE, JFrame ................................. 647 FilterReader, Klasse .......................................... 478 exportObject(), UnicastRemoteObject ...... 1048 FilterWriter, Klasse ........................................... 478 eXtensible Markup Language ......................... 532 final, Schlüsselwort ........................................ 1238 Fingerabdruck .................................................. 1371 F FIPS ...................................................................... 1372 Firewall ............................................................... 1054 Farbe ...................................................................... 897 First in, First out ................................................ 184 Farbmodell ........................................................... 902 Fitts’s Law ............................................................ 718 Farbsättigung ...................................................... 902 Five-Nine-System ............................................ 1367 fastutil ................................................................... 208 Flache Kopie ........................................................ 234 FEBRUARY, Calendar ......................................... 323 FlowLayout, Klasse ................................... 717–718 Federal Information Processing Standards Flushable, Schnittstelle ................................... 444 Publication ................................................... 1372 FocusEvent, Klasse ............................................ 674 Fenster .................................................................. 645 FocusListener, Schnittstelle ........................... 702 Fenstermenü ....................................................... 748 Fokus ..................................................................... 701 Field, Klasse ................................ 1243–1244, 1255 Font, Klasse ................................................ 656, 878 Fielding, Roy Thomas .................................... 1059 FontFormatException ...................................... 882 FIFO-Prinzip ......................................................... 184 FontMetrics, Klasse ........................................... 882 File, Klasse ............................................................ 358 FontRenderContext, Klasse ............................ 885 file.encoding ........................................................ 491 ForkJoinPool, Klasse ......................................... 153 File.separatorChar ............................................. 360 format() ................................................................ 455 FileAlreadyExistsException ............................ 406 Formatierungsanweisungen .......................... 347 FileAttribute, Schnittstelle .............................. 406 Formatierungsstring ............................... 350–351 FileChannel, Klasse ................................... 376, 424 forName(), Class ............................................... 1229 FileDescriptor, Klasse ....................................... 435 Fortschrittsbalken ............................................. 745 FileFilter, Schnittstelle ..................................... 366 Frame .................................................................... 645 FileInputStream, Klasse ................................... 431 FRANCE, Locale .................................................. 310 FileNameExtensionFilter, Klasse .................. 823 FRENCH, Locale .................................................. 310 FilenameFilter, Schnittstelle .......................... 366 Fronleichnam ..................................................... 326 FileOutputStream, Klasse ................................ 431 FULL, DateFormat .............................................. 348 FilePermission ................................................. 1366 Füllfaktor ............................................................. 241 FileReader, Klasse .............................................. 430 Füllmuster ........................................................... 912 FileSystem, Klasse .............................................. 386 Füllung, Paint ..................................................... 896 FileSystem, Schnittstelle ................................. 416 Future, Schnittstelle ........................................... 94 1417 1507.book Seite 1418 Mittwoch, 12. Oktober 2011 12:49 12 Index G GMST ..................................................................... 305 GNU Trove ........................................................... 208 G1, Garbage-Collector ........................................ 60 Google Collections Library .............................. 294 Gebundene Property ........................................ 711 Google Guava ............................................. 294, 304 Geburtsdatum .................................................... 332 GradientPaint ..................................................... 897 Geburtstagsparadoxon .................................. 1371 grant-Anweisung ............................................ 1363 Gegenseitiger Ausschluss ......................... 99, 104 Granularität, Threads ......................................... 88 General Header ................................................ 1002 Graphics Interchange Format ........................ 914 GeneralPath, Klasse .......................................... 891 Graphics, Klasse ................................................. 866 -genkey ............................................................... 1369 Graphics2D, Klasse ............................................ 866 Geordnete Liste .................................................. 183 GraphicsEnvironment, Klasse ....................... 880 GERMAN, Locale ................................................ 310 Greenwich Mean Sidereal Time ..................... 305 GERMANY, Locale .............................................. 310 GregorianCalendar, Klasse ..................... 320, 322 get(), List ............................................................... 189 Gregorianischer Kalender ............................... 320 get(), Map ............................................................. 232 GridBagConstraints, Klasse ............................ 726 GET, HTTP-Methode ....................................... 1000 GridBagLayout, Klasse ............................. 717, 725 getAttribute(), Files ........................................... 404 GridLayout, Klasse .................................... 717, 724 getBytes(), ResultSet ....................................... 1175 Groovy ............................................................... 1313 getClass(), Object ............................................. 1229 Groovy-Eclipse ................................................. 1313 getColumnClass(), TableModel ...................... 793 GroupLayout, Klasse ......................................... 717 getColumnCount(), TableModel ................... 793 Grundlinie ........................................................... 877 getColumnName(), TableModel .................... 793 Grundton ............................................................. 902 getConnection(), DriverManager ................ 1160 Guard ..................................................................... 131 getContentPane(), JFrame ............................... 646 Guarded action ................................................... 131 getDefaultToolkit(), Toolkit ............................ 650 Guarded wait ....................................................... 131 getFileAttributeView(), Files .......................... 401 Guava ........................................................... 294, 304 getInstance(), Calendar .................................... 324 GUI-Builder ....................................................... 1227 GET-Methode ............................................. 973, 999 Guice ................................................................... 1221 getPriority(), Thread ........................................... 87 Gültigkeit, XML .................................................. 535 getProperty(), Properties ................................. 243 gzip ...................................................................... 1006 getResource() ...................................................... 446 GZIPInputStream, Klasse ................................. 627 getResourceAsStream() ................................... 446 GZIPOutputStream, Klasse ............................. 627 getRowCount(), TableModel ........................... 793 GetStringUTFChars ......................................... 1345 getTableCellEditorComponent(), H TableCellEditor .............................................. 801 H2 ........................................................................ 1143 getText(), JLabel ................................................. 654 Halbierungssuche .............................................. 278 getText(), JTextComponent ............................ 685 Hashcode .............................................................. 241 getTimeInMillis(), Calendar ........................... 325 Hash-Funktion .................................................... 241 getValueAt(), TableModel ............................... 793 HashMap, Klasse ....................................... 186, 229 GIF .......................................................................... 914 HashSet, Klasse .......................................... 184, 213 Glass-Pane ........................................................... 815 Hash-Tabelle ........................................................ 229 Globbing-Syntax ................................................ 411 Hash-Verfahren ............................................... 1371 gluegen ............................................................... 1352 HEAD, HTTP-Methode ................................... 1000 Glyphe .................................................................. 877 Header-Datei .................................................... 1341 1418 1507.book Seite 1419 Mittwoch, 12. Oktober 2011 12:49 12 Index HEAD-Methode ................................................... 999 ImageIO ................................................................ 915 Helligkeit .............................................................. 902 ImageIO, Klasse .................................................. 915 Hexadezimalsystem ........................................... 41 ImageObserver, Schnittstelle ........................ 918 Hibernate .......................................................... 1206 InetAddress, Klasse ........................................... 979 Hibernate Validator ....................................... 1208 InetSocketAddress, Klasse .............................. 988 HierarchyEvent, Klasse .................................... 675 Inflater, Klasse .................................................... 626 High-level event ................................................. 674 InheritableThreadLocal, Klasse ..................... 159 Hoare, C. A. R. ...................................................... 104 InputMethodEvent, Klasse ............................. 675 Host-Adresse ....................................................... 977 InputStream, Klasse ......................................... 445 HOUR, Calendar .................................................. 329 InputStreamReader, Klasse ............................ 492 HOUR_OF_DAY, Calendar ............................... 329 InstallShields .................................................... 1137 HSB ......................................................................... 902 instanceof, Schlüsselwort ............................. 1235 HSQLDB ............................................................. 1141 InstantiationException ...................... 1242, 1254 HTML ............................................................ 531, 998 instrumentalisierte Objekte ........................ 1325 HTML-Formular .............................................. 1095 Integritätsprüfung von Nachrichten ......... 1371 HTTP ............................................................. 957, 998 Inter-Client Communication Convention HTTP 0.9 ............................................................. 1003 Manual ............................................................. 837 HTTP 1.0 ................................................................ 999 Interface/Implementation-Pair .................... 792 http.proxyHost ................................................ 1008 Intermediate container ................................... 712 http.proxyPort ................................................. 1008 Internal frame .................................................... 815 HttpClient ............................................................ 997 Internationalisierung ...................................... 313 HttpComponents ............................................... 997 Internes Fenster ................................................. 815 HttpHandler, Schnittstelle ........................... 1006 Internet Control Message Protocol ............ 1031 HTTP-Header ....................................................... 967 Internet Engineering Task Force .................. 957 https.ProxyHost .............................................. 1008 Internet Protocol ............................................... 956 https.ProxyPort ............................................... 1008 Internet-Media-Types .................................... 1005 HttpServer, Klasse .......................................... 1006 Inter-ORB Protocol .......................................... 1053 HttpServerFactory, Klasse ............................ 1063 Interrupt ................................................................ 79 HttpSession, Schnittstelle ............................ 1111 interrupt(), Thread ...................................... 79, 136 Hue ......................................................................... 902 interrupted(), Thread ......................................... 81 Hypertext Transfer Protocol ................. 957, 998 InterruptedException ................ 74, 81, 126, 136 InterruptedIOException .................................. 991 I Intersolv ............................................................. 1150 Introspection .................................................... 1227 ICCCM .................................................................... 837 invalidate(), Component ................................. 710 ICMP ................................................................... 1031 InvalidClassException ............................ 505, 517 ICO .......................................................................... 915 Inversion of Control ....................................... 1221 IdentityHashMap, Klasse ................................. 237 Invocation API ................................................. 1353 IETF ......................................................................... 957 Invocation-API ................................................. 1338 IIOP ..................................................................... 1053 InvocationEvent, Klasse .................................. 850 IllegalAccessException .................................. 1242 InvocationTargetException .............. 1242, 1255 IllegalMonitorStateException ............... 129, 136 invoke(), Method ............................................. 1264 IllegalThreadStateException ............................ 67 invokeAndWait(), SwingUtilities .................. 848 Image, Klasse ....................................................... 914 invokeLater(), SwingUtilities ................ 747, 848 ImageIcon, Klasse .............................................. 657 Invoker-Servlet ................................................ 1117 1419 1507.book Seite 1420 Mittwoch, 12. Oktober 2011 12:49 12 Index IoC-Container ................................................... 1221 Java Document Object Model ......................... 545 IP ............................................................................ 956 Java Foundation Classes (JFC) ......................... 869 IP-Adresse ............................................................ 977 Java Image Management Interface ............... 915 isCellEditable(), TableModel .................. 793, 795 Java Management Beans ............................... 1325 isInterrupted(), Thread ...................................... 79 Java Management Extensions .................... 1324 ISO Country Code .............................................. 309 Java Message Service ..................................... 1055 ISO Language Code ........................................... 309 Java Native Interface ...................................... 1337 ISO-639-Code ...................................................... 309 Java Network Launcher Protocol ................ 1137 ISO-Abkürzung ................................................... 312 Java Object Serialization .................................. 502 ITALIAN, Locale .................................................. 310 Java OpenGL ........................................................ 953 ItemEvent, Klasse .............................................. 740 Java Persistence API .......................................... 503 ItemListener, Schnittstelle ... 740, 742, 745, 779 Java Persistence API (JPA) ............................. 1206 ItemSelectable, Schnittstelle .......................... 741 Java Plug-In ....................................................... 1123 itemStateChanged(), ItemListener ............... 742 Java Secure Socket Extension ........... 1008, 1033 Iterable, Schnittstelle ....................................... 187 Java Virtual Machine Process Status Iterator ................................................................. 249 Iterator, Schnittstelle .............................. 249, 260 iText ...................................................................... 622 Tool ................................................................. 1381 Java Virtual Machine Statistics Monitoring Tool ......................................... 1382 java.awt.event, Paket ........................................ 673 J java.awt.geom, Paket ........................................ 870 java.beans, Paket ................................................ 523 JAAS 씮 Java Authentication and Authorization Service (JAAS) java.lang.management, Paket ..................... 1326 java.naming.factory.initial .......................... 1198 Jackson ................................................................. 620 java.net, Paket ..................................................... 955 Jad, Decompiler ................................................ 1405 java.nio.file, Paket ............................................. 386 Jahr ............................................................... 328, 350 java.nio.file.attribute, Paket ........................... 397 JAI ........................................................................... 915 java.rmi.server.codebase .............................. 1053 Jakarta HttpClient ............................................. 997 java.rmi.useCodebaseOnly .......................... 1053 JANUARY, Calendar ........................................... 323 java.security ..................................................... 1364 JAPAN, Locale ...................................................... 310 java.sql.Date, Klasse ....................................... 1173 JAPANESE, Locale ............................................... 310 java.sql.Time, Klasse ...................................... 1173 Jar-Archiv ........................................................... 1087 java.util.concurrent, Paket .............................. 286 Jar-Datei ............................................................... 969 java.util.concurrent.atomic, Paket ...... 114, 148 JarFile, Klasse ............................................. 640, 970 java.util.jar, Paket .............................................. 625 jarsigner, Dienstprogramm .......................... 1370 java.util.zip, Paket ..................................... 625–626 JarURLConnection, Klasse .............................. 970 Java-Beans ......................................................... 1227 Java 2D-API .......................................................... 869 JavaBeans Activation Framework .............. 1021 Java Accessibility ............................................... 854 JavaBeans Persistence ...................................... 502 Java API for XML Parsing ................................. 546 Java-Cryptography-API ................................. 1356 Java Authentication and Authorization Service JavaDoc-Tag ...................................................... 1227 (JAAS) ................................................... 1356, 1367 JavaFX ................................................................. 1124 Java Cryptography Architecture ................. 1356 javah, Dienstprogramm ................................ 1341 Java Cryptography Extension (JCE) ............ 1356 javah-Task, Ant ................................................ 1341 Java Database Connectivity .......................... 1148 Java-Look-and-Feel ............................................ 830 Java DB ................................................................ 1140 JavaMail API ..................................................... 1020 1420 1507.book Seite 1421 Mittwoch, 12. Oktober 2011 12:49 12 Index javap ................................................................... 1399 JEditorPane, Klasse .................................. 683, 692 JavaScript .......................................................... 1135 Jersey, JAX-RS Implementierung ................ 1060 JavaServer Faces .............................................. 1120 Jetty ..................................................................... 1084 JavaServer Page ............................................... 1081 JFileChooser, Klasse .......................................... 823 javax.crypto, Paket ......................................... 1356 JFormattedTextField, Klasse ................. 683, 687 javax.jws, Paket ............................................... 1074 JFrame, Klasse ........................................... 645, 867 javax.net, Paket ............................................... 1033 JGoodies Looks ................................................... 833 javax.script, Paket ................................ 1306, 1312 Jimi ........................................................................ 915 javax.sound, Paket .................................... 640–641 Jindent ................................................................ 1409 javax.sound.midi, Paket .................................. 642 JLabel, Klasse ....................................................... 653 javax.swing, Paket ............................................. 645 jlGui ....................................................................... 641 javax.swing.text, Paket .................................... 683 JList, Klasse .......................................................... 767 javax.swing.undo, Paket .................................. 842 jmap, Dienstprogramm ................................. 1382 javax.xml.bind.annotation, Paket ................ 549 JMenu, Klasse ............................................ 748, 750 Jawin ................................................................... 1353 JMenuBar, Klasse ............................................... 748 JAXB ....................................................................... 548 JMenuItem, Klasse ................................... 680, 750 JAXBContext, Klasse ......................................... 549 JMS ....................................................................... 1055 Jaxen ............................................................. 590, 607 JMX ...................................................................... 1324 JAXP .............................................................. 546–547 JMXConnector, Schnittstelle ........................ 1336 JAX-RPC .............................................................. 1073 JMXConnectorServer, Klasse ....................... 1335 JAX-RS ................................................................. 1060 JNDI ..................................................................... 1196 JAX-RS-Injizierung .......................................... 1069 jndi.properties ................................................. 1196 JAX-WS ............................................................... 1073 JNI ........................................................................ 1337 JAX-WS RI .......................................................... 1073 Joda Time ............................................................. 355 JBP, JavaBeans Persistence .............................. 502 JOGL ....................................................................... 953 JButton, Klasse ........................................... 676, 680 join(), Thread ........................................................ 84 JCA ....................................................................... 1356 JOIN_BEVEL, BasicStroke ................................ 910 JCheckBox, Klasse .............................................. 680 JOIN_MITER, BasicStroke ................................ 910 JCheckBoxMenuItem, Klasse .......................... 750 JOIN_ROUND, BasicStroke .............................. 910 jCIFS ....................................................................... 378 JoinRowSet, Schnittstelle .............................. 1183 JComboBox, Klasse ............................................ 775 jOpenDocument ................................................ 624 jconsole, Dienstprogramm .......................... 1328 JOptionPane, Klasse .......................................... 820 JDBC .................................................................... 1148 JOS, Java Object Serialization ......................... 502 JDBC 1.0 .............................................................. 1151 JPA (Java Persistence API) ......... 503, 1199, 1206 JDBC 2.0 API ...................................................... 1151 JPA 씮 JPA (Java Persistence API) JDBC 2.0 Optional Package API ................... 1151 JPanel, Klasse ............................................. 712, 716 JDBC 2.1 core API ............................................. 1151 JPasswordField, Klasse ............................ 683, 686 jdbc.drivers ....................................................... 1160 JPEG ....................................................................... 914 JDBC-ODBC-Bridge-Treiber .......................... 1149 JPopupMenu, Klasse ......................................... 760 JDBCRowSet, Schnittstelle ............................ 1182 JProgressBar, Klasse ................................. 745, 849 JDesktopPane, Klasse ........................................ 815 jps, Dienstprogramm .......................... 1328, 1381 JDialog, Klasse ..................................................... 819 JRadioButton, Klasse ............................... 680, 743 JDOM ..................................................................... 545 JRadioButtonMenuItem, Klasse .................... 750 JDOMResult, Klasse ........................................... 613 JRMP (Java Remote Method Protocol) ....... 1053 JDOMSource, Klasse .......................................... 613 JRootPane, Klasse .............................................. 815 1421 1507.book Seite 1422 Mittwoch, 12. Oktober 2011 12:49 12 Index jrunscript, Dienstprogramm ....................... 1306 KeyListener, Schnittstelle ............................... 703 JScrollBar, Klasse ...................................... 713, 734 KeyPairGenerator, Klasse ............................. 1376 JScrollPane ........................................................... 713 KeySelectionManager, Schnittstelle ............ 779 JScrollPane, Klasse ......... 691, 712–713, 769, 790 keySet(), Map ....................................................... 238 JSlider, Klasse ...................................................... 733 Keystore ............................................................. 1370 JSON (JavaScript Object Notation) ..... 619, 1066 keytool, Dienstprogramm ............................ 1369 JSP ........................................................................ 1081 Klasse ..................................................................... 929 JSpinner, Klasse .................................................. 787 Klassenlader ..................................................... 1357 JSplitPane, Klasse ..................................... 712, 715 Kollision, Signatur .......................................... 1371 jsr166y .................................................................. 152 Kollisionsangriff ............................................. 1371 JSR-203 .................................................................. 386 Kompressionsfunktion ................................. 1371 JSR-223 ................................................................ 1306 Kompressionsstufe ........................................... 932 JSR-299 ..................................................... 1221, 1224 Komprimierungsfaktor ................................... 914 JSR-303:Bean Validation ................................ 1207 Konstruktive Flächengeometrie ................... 891 JSR-311 ................................................................ 1060 Kontextmenü ..................................................... 759 JSSE ...................................................................... 1008 Kontraktionsfunktion ................................... 1371 jstack, Dienstprogramm ................................ 1383 Kontrollfeldgruppe ........................................... 743 jstat, Dienstprogramm .................................. 1382 Koordinierte Weltzeit ....................................... 306 JSTL ...................................................................... 1101 Kopfdefinition .................................................... 535 JTabbedPane, Klasse ................................ 712, 714 KOREA, Locale ..................................................... 310 JTable, Klasse ...................................................... 789 KOREAN, Locale .................................................. 310 JTableHeader, Klasse ........................................ 804 Kritischer Abschnitt ............................................ 99 JTextArea, Klasse ............................................... 683 Kryptografische Prüfsumme ....................... 1371 JTextComponent, Klasse ................................. 685 Kubische Kurvensegmente ............................. 890 JTextField, Klasse ...................................... 683–684 Kurve ..................................................................... 890 JTextPane, Klasse ............................................... 683 JTidy ...................................................................... 621 L JToggleButton, Klasse ............................. 680, 682 JToolBar, Klasse ......................................... 712, 756 Last-in-First-out ................................................. 218 JTree, Klasse ........................................................ 809 Latin-1 ................................................................... 491 JULY, Calendar .................................................... 323 Laufwerksname .................................................. 374 JUNE, Calendar ................................................... 323 LayoutManager, Schnittstelle ........................ 718 JViewport, Klasse ............................................... 713 lazy activation ................................................. 1054 JWindow, Klasse ................................................. 818 LD_LIBRARY_PATH ........................................ 1340 JXPath ................................................................... 616 leading .................................................................. 884 Lease ................................................................... 1050 K lib/security ....................................................... 1364 Kanonischer Pfad .............................................. 361 line joins ...................................................... 908, 910 Keller ..................................................................... 218 line.separator ................................................... 1360 Kerberos ............................................................. 1368 Line2D, Klasse ............................................ 887–888 Key, Schnittstelle .................................... 184, 1375 LinearGradientPaint ......................................... 897 KeyEvent, Klasse ....................................... 675, 703 LineBorder, Klasse ............................................. 699 KeyGenerator, Klasse ..................................... 1376 LineMetrics, Klasse ............................................ 885 1422 LIFO ........................................................................ 218 1507.book Seite 1423 Mittwoch, 12. Oktober 2011 12:49 12 Index LineNumberReader, Klasse ............................. 474 M lineTo(), GeneralPath ........................................ 891 Linie ....................................................................... 870 MAC ..................................................................... 1371 Linienende ........................................................... 909 MAC-Adresse .................................................... 1032 Linien-Pattern ..................................................... 908 Magische Zahlenwerte ................................... 1238 Linienverbindung .............................................. 910 Mail User Agent ............................................... 1019 LinkedBlockingDeque, Klasse ........................ 222 MalformedURLException ............................... 959 LinkedBlockingQueue, Klasse ........................ 287 Management Interface .................................. 1325 LinkedHashSet, Klasse ...................................... 218 ManagementFactory, Klasse ........................ 1330 LinkedList, Klasse ................... 183–185, 188, 200 Manipulation Detection Code ..................... 1371 LinkOption, Aufzählung .................................. 396 Map, Schnittstelle ........................... 176, 185, 228 List, Schnittstelle ....................................... 183, 188 Map.Entry, Klasse .............................................. 239 ListCellRenderer, Schnittstelle ....................... 774 MappedByteBuffer, Klasse .............................. 425 Liste ........................................................................ 188 MARCH, Calendar .............................................. 323 Liste füllen ........................................................... 280 Markierungsschnittstelle ............................... 508 Listener ................................................................. 662 Marshaller, Schnittstelle ................................. 549 ListIterator, Schnittstelle ................................. 202 Marshalling ....................................................... 1038 ListSelectionEvent, Klasse ...................... 769, 771 MatteBorder, Klasse ......................................... 699 ListSelectionListener, Schnittstelle ..... 769, 771 Mausrad ............................................................... 705 ListSelectionModel, Schnittstelle ................. 805 Maven ................................................................. 1393 Load Factor .......................................................... 241 max(), Collections ............................................. 267 load(), System ................................................... 1340 MAX_PRIORITY, Thread .................................... 87 loadLibrary(), System ..................................... 1339 MAY, Calendar .................................................... 323 Locale ..................................................................... 310 MBean ................................................................. 1325 Locale, Klasse ...................................................... 309 MBean-Server ................................................... 1325 LocateRegistry, Klasse ................................... 1045 MD ....................................................................... 1371 Location, Response-Header ......................... 1005 MD2 ..................................................................... 1371 Lock ............................................................... 104, 114 MD4 ..................................................................... 1371 lock(), Lock ........................................................... 106 MD5 ..................................................................... 1371 Lock-free-Algorithmus ..................................... 284 MDC ..................................................................... 1371 Locking .................................................................. 376 MediaTracker, Klasse ....................................... 934 log4j ......................................................... 1315, 1320 MediaType, Klasse ........................................... 1062 Logback .............................................................. 1324 MEDIUM, DateFormat ..................................... 348 logClass .............................................................. 1049 Megginson, David ............................................. 545 Logging, RMI .................................................... 1049 Memory Map .................................................... 1382 Login-Modul ..................................................... 1367 Menü ..................................................................... 748 Logisch atomar ................................................... 128 Menübalken ........................................................ 748 Log-Level ........................................................... 1317 Menüeintrag ....................................................... 748 lokale Objekte .................................................. 1042 Menütrennlinie ................................................. 750 Lokaler Host ........................................................ 980 Merant ................................................................ 1150 Lokalisierung ...................................................... 313 Meridian .............................................................. 305 LONG, DateFormat ............................................ 348 Message Authentication Code ..................... 1371 Low-level event .................................................. 674 Message Integrity Check ............................... 1371 Message Queues .............................................. 1055 Message Store ................................................... 1019 1423 1507.book Seite 1424 Mittwoch, 12. Oktober 2011 12:49 12 Index Message Transfer Agent ................................ 1019 MouseMotionListener, Schnittstelle ........... 662 Message Transfer System ............................. 1019 MouseWheelEvent, Klasse .............................. 705 Message-Digest ................................................ 1371 MS ........................................................................ 1019 MessageDigest, Klasse ................................... 1372 MTA ..................................................................... 1019 Metadaten .............................................. 1003, 1191 MTS ..................................................................... 1019 META-INF/services ......................................... 1222 MUA .................................................................... 1019 Meta-Information ........................................... 1005 Multicast-Kommunikation .......................... 1033 Metal, Look and Feel ......................................... 830 Multi-catch ............................................................ 44 Meta-Objekt ...................................................... 1228 Multi-Map ............................................................ 295 Meta-Programming ........................................ 1227 Multi-Menge ....................................................... 295 Method, Klasse ................................................. 1246 MULTIPLE_INTERVAL_SELECTION, Methode des Aufrufes .................................... 1000 MIC ...................................................................... 1371 ListSelectionModel ....................................... 771 Multipurpose Internet Mail Microsoft Access .............................................. 1143 Extensions .................................................... 1020 Microsoft Silverlight ...................................... 1124 Multi-Set ............................................................... 295 Microsoft SQL Server ...................................... 1143 MutableTreeNode, Schnittstelle .................... 809 Middleware ....................................................... 1040 Mutex .................................................................... 104 MIDI ....................................................................... 642 MVC ....................................................................... 765 MidiSystem, Klasse ........................................... 642 MXBeans ............................................................ 1325 MILLISECOND, Calendar .................................. 329 MySQL ................................................................ 1142 Millisekunde ....................................................... 329 MIME ................................................................... 1020 N MimeMultipart, javax.mail .......................... 1028 MIME-Nachrichten ......................................... 1003 Namensdienst ....................................... 1038, 1045 MIME-Typ ............................................................ 968 Namensraum ...................................................... 542 min(), Collections .............................................. 267 Native Methode ............................................... 1337 MIN_PRIORITY, Thread ..................................... 87 Native Protocol All-Java Driver ................... 1150 Minute .................................................................. 329 native, Schlüsselwort ..................................... 1338 MINUTE, Calendar ............................................. 329 Native-API Java Driver ................................... 1150 Mitteleuropäische Zeit (MEZ) ........................ 336 Natürliche Ordnung .......................................... 263 Mnemonic ........................................................... 753 NavigableMap, Schnittstelle .................. 185, 230 Modal .................................................................... 819 NavigableSet, Schnittstelle ............................. 216 Model .................................................................... 765 Navigation ........................................................... 701 Model MBeans .................................................. 1325 Nearest neighbor algorithm ........................... 929 Model-View-Controller .................................... 765 Nelson ................................................................ 1035 Modifizierer ...................................................... 1238 NetPermission ................................................. 1366 Monat ................................................................... 328 netstat ................................................................... 989 Monitor ................................................................ 104 Network Filesystem ....................................... 1011 monitorenter ...................................................... 104 network-address.cache.ttl, Property ............ 981 monitorexit ........................................................ 104 NetworkInterface, Klasse ................................. 981 Monitoring ........................................................ 1324 Netz-Protokoll All-Java Driver .................... 1151 MONTH, Calendar ............................................. 328 new, Schlüsselwort ......................................... 1253 Mouse wheel ....................................................... 705 newDirectoryStream(), Files .................. 410–411 MouseEvent, Klasse .......................................... 675 newInstance(), Array ...................................... 1240 MouseListener, Schnittstelle ......................... 662 newInstance(), Constructor ......................... 1253 1424 1507.book Seite 1425 Mittwoch, 12. Oktober 2011 12:49 12 Index newLine(), BufferedWriter .............................. 471 Open MBeans ................................................... 1325 NFS ...................................................................... 1011 OpenDocument ................................................. 624 Nicht ausführend ............................................... 126 openStream(), URL ............................................ 963 Nicht direkte ByteBuffer .................................. 423 OperatingSystemMXBean, Nicht-modal ........................................................ 819 Schnittstelle .................................................. 1326 Nimbus, Look and Feel ..................................... 830 Optionale Operation ........................................ 273 NIO.2 ...................................................................... 386 Optionsfeld ......................................................... 743 NO_SUCH_PAGE, Printable ............................ 945 Oracle Database ............................................... 1143 NoClassDefFoundError ................................. 1230 OracleDriver ..................................................... 1162 NoSuchAlgorithmException ....................... 1373 org.jdom, Paket .................................................. 589 NoSuchElementException ..................... 221, 249 OR-Mapping ........................................................ 503 NoSuchFieldException .................................. 1242 Ostersonntag ...................................................... 326 NoSuchMethodException ............................ 1242 OutputStream, Klasse ...................................... 441 NoSuchProviderException ........................... 1373 OutputStreamWriter, Klasse .......................... 491 notify(), Object ........................................... 124, 135 OverlayLayout, Klasse ...................................... 732 notifyAll() ............................................................. 128 NotSerializableException .............. 505, 508, 510 P NOVEMBER, Calendar ....................................... 323 Null Object Pattern ............................................ 274 P2P ....................................................................... 1055 NULL, SQL .......................................................... 1175 Pack200 ................................................................ 625 PAGE_EXISTS, Printable .................................. 945 O paint(), Frame ..................................................... 865 Oberklasse finden ........................................... 1236 paintComponent() ............................................ 867 Oberlänge ............................................................. 884 Palmsonntag ....................................................... 326 Obfuscator .................................. 1230, 1398, 1406 Parsed Character Data ...................................... 537 Object Management Group .............. 1037, 1053 ParseException .................................................. 353 Object Serialization Stream Protocol ........... 511 Passionssonntag ................................................ 326 ObjectInputStream, Klasse .............................. 505 Path, Klasse ......................................................... 386 ObjectName, Klasse ........................................ 1333 Paths, Klasse ....................................................... 386 ObjectOutputStream, Klasse .......................... 504 PCDATA ................................................................ 537 ObjectStreamField, Klasse ............................... 511 PDFBox ................................................................. 622 Objekt-relationales Mapping ......................... 503 Peer-Elemente .................................................... 845 Observer-Pattern ............................................... 765 Permissions ...................................................... 1366 Ocean, Look and Feel ........................................ 830 Persistence Unit ............................................... 1203 OCTOBER, Calendar ........................................... 323 PersistenceDelegate, Klasse ........................... 525 ODBC ....................................................... 1144, 1149 Persistenz ............................................................ 502 ODBC-Datenquellen-Administrator .......... 1144 Pfad ........................................................................ 891 ODF Toolkit .......................................................... 624 Pfingstsonntag ................................................... 326 ODF, OpenDocument ....................................... 624 PHP ...................................................................... 1080 Oktalsystem .......................................................... 41 PipedInputStream, Klasse .............................. 494 Olsen-Datenbank ............................................... 339 PipedOutputStream, Klasse ........................... 494 OMG (Object Management Group) ............ 1037 PipedReader, Klasse .......................................... 494 Opak ....................................................................... 711 PipedWriter, Klasse ........................................... 494 Open Database Connectivity Standard .... 1149 Plain Old Java Object ...................................... 1220 Paint, Schnittstelle ............................................ 896 1425 1507.book Seite 1426 Mittwoch, 12. Oktober 2011 12:49 12 Index Plattenspeicher .................................................. 375 PriorityBlockingQueue, Klasse ...................... 290 Pluggable Authentication Module PriorityQueue, Klasse ....................................... 184 (PAM) .............................................................. 1367 PriorityQueue, Schnittstelle ........................... 290 POCO ................................................................... 1220 private, Schlüsselwort ................................... 1238 Point-to-Point .................................................. 1055 PrivateKey, Schnittstelle .............................. 1375 POJO .................................................................... 1220 probeContentType, Files ................................. 409 Policy-Datei ....................................................... 1363 Programm-Icon .................................................. 921 policytool, Dienstprogramm ....................... 1365 ProGuard ........................................................... 1407 Polygon ................................................................ 874 Properties, Klasse .............................................. 243 Polygon, Klasse ......................................... 874, 888 PropertyChangeEvent, Klasse ........................ 711 Polyline ................................................................ 874 Property-Datei .................................................... 618 POP before send ............................................... 1027 PropertyDescriptor, Klasse .......................... 1250 POP3 .................................................................... 1020 PropertyPermission ....................................... 1366 Popup-Menü ....................................................... 759 Proposed Standard ............................................ 957 Port 1234 .............................................................. 989 protected, Schlüsselwort .............................. 1238 Port, RMI-Namensdienst ............................... 1046 Protocol Buffers ........................................ 503, 526 Port-Adresse ....................................................... 983 Protocol Handler ....................................... 967–968 Position des Fensters ....................................... 649 Protokoll ............................................................... 957 PosixFileAttributes, Schnittstelle ................. 399 Proxy .................................................................. 1035 PosixFileAttributeView, Schnittstelle ......... 403 Proxy-Authenticate, Response-Header .... 1005 PosixFilePermission, Aufzählung ................ 400 Proxy-Authorization ........................................ 972 PosixFilePermissions, Klasse ......................... 400 ProxySelector, Klasse .................................... 1009 POST, HTTP-Methode ..................................... 1000 Proxy-Server .................................................... 1007 PostgreSQL ........................................................ 1142 Public, Response-Header .............................. 1005 POST-Methode .......................................... 973, 999 public, Schlüsselwort ..................................... 1238 POST-Request ..................................................... 976 PublicKey, Schnittstelle ................................ 1375 PowerPoint-Dokumente ................................. 623 Publish-Subscribe ........................................... 1055 Prädikat ................................................................ 298 Pulldown-Menü ................................................. 748 Pragma ............................................................... 1004 PushbackInputStream, Klasse ....................... 474 Preimage-Angriff ............................................. 1372 PushbackReader, Klasse ................................... 474 PreparedStatement, Schnittstelle ... 1168, 1187 put(), Map ............................................................. 231 Primzahlen .......................................................... 304 PUT, HTTP-Methode ...................................... 1000 Principal .................................................. 1363, 1368 print() .................................................................... 455 Q Printable, Schnittstelle .................................... 944 PrinterJob, Klasse .............................................. 944 QuadCurve2D, Klasse ....................................... 888 printf() .................................................................. 455 Quadratische Kurvensegmente ..................... 890 PrintJob, Klasse .................................................. 944 quadTo(), GeneralPath ..................................... 891 println() ................................................................ 455 Quartz ................................................................... 172 PrintService, Schnittstelle .............................. 946 Quellcode-Verschönerer ............................... 1408 PrintStream ......................................................... 455 Query-String ........................................................ 973 PrintWriter .......................................................... 455 Queue, Schnittstelle ........................ 184, 220–221 Priorität, Thread .................................................. 87 Quoted Printing Encoding ........................... 1020 Prioritätswarteschlange .................................... 87 1426 1507.book Seite 1427 Mittwoch, 12. Oktober 2011 12:49 12 Index R Request-Header ............................................... 1002 ResourceBundle, Klasse ................................... 313 Race condition .................................................... 102 Response-Header ................................. 1002, 1005 Race hazard .......................................................... 102 RESTful Web-Services ..................................... 1058 RadialGradientPaint ......................................... 897 Result, Schnittstelle .......................................... 613 Rahmen ................................................................. 699 ResultSet, Schnittstelle .................................. 1169 RandomAccess, Schnittstelle ......................... 197 ResultSetMetaData, Schnittstelle ............... 1191 RandomAccessFile, Klasse ............................... 379 resume(), Thread ................................................. 87 readAttributes() , Files ...................................... 398 RetentionPolicy, Aufzählung ....................... 1279 Reader, Klasse ..................................................... 451 Retry-After, Response-Header ..................... 1005 readLine(), BufferedReader ............................. 473 Reverse Engineering ....................................... 1404 readObject(), ObjectInputStream .................. 505 RFC ......................................................................... 956 readResolve() ....................................................... 515 RFC 2616 ............................................................... 998 readSymbolicLink(), Files ................................ 408 RGB ........................................................................ 902 readUTF(), RandomAccessFile ........................ 382 Rhino ................................................................... 1306 ReadWriteLock, Schnittstelle ......................... 109 Rich Text Format ............................................... 692 rebind(), Registry ............................................ 1048 RMI ...................................................................... 1037 Rectangle2D, Klasse .......................................... 888 RMI Wire Protocol ........................................... 1039 RectangularShape, Klasse ................................ 888 rmi:// .................................................................. 1048 Reentrant ............................................................. 122 rmic, Dienstprogramm .................................. 1044 Reentrant, Klasse ...................................... 106, 125 RMIClassLoader, Klasse ................................. 1053 ReentrantReadWriteLock, Klasse .................. 109 rmid, Dienstprogramm ................................. 1055 Reference Concrete Syntax ............................. 533 RMI-Klassenlader ............................................ 1052 Referenced-Meldung ..................................... 1050 RMI-Logging ..................................................... 1050 Reflection .......................................................... 1227 rmiregistry, Dienstprogramm .......... 1046, 1198 ReflectiveOperationException ................... 1242 RMI-Transportschicht .................................... 1039 ReflectPermission ........................................... 1366 Rollbalken ............................................................ 733 Registry ................................................... 1038, 1045 Rollenbasierte Rechtevergabe ..................... 1367 REGISTRY_PORT, Registry ............................ 1045 Rollrad .................................................................. 705 Relationales Datenbanksystem .................. 1148 Ron Rivest .......................................................... 1371 Remote Manager ............................................. 1325 Rotation ............................................................... 941 Remote Object Activation ............................ 1054 RoundRectangle2D, Klasse ............................. 888 Remote Procedure Call .................................. 1037 RowFilter, Klasse ............................................... 807 Remote, Schnittstelle ..................................... 1042 RowSet, Schnittstelle ...................................... 1182 RenderedImage, Schnittstelle ........................ 929 RPC ....................................................................... 1037 Rendering-Algorithmus ................................... 941 RTF ......................................................................... 692 Renderpack Render Pipelines ........................ 809 run(), Runnable .................................................... 65 Rendezvous .................................................. 84, 145 Runnable, Schnittstelle ..................................... 65 repaint() ................................................................ 869 Runtime Packages ........................................... 1355 replaceAll(), Collections ................................... 279 RuntimePermission ....................................... 1366 ReplicateScaleFilter, Klasse ............................. 929 Representational State Transfer (REST) .... 1059 Request .............................................................. 1000 S Request For Comment ...................................... 956 Sandbox ............................................................. 1357 requestFocusInWindow(), JComponent ...... 702 Saturation ............................................................ 902 1427 1507.book Seite 1428 Mittwoch, 12. Oktober 2011 12:49 12 Index SAX ........................................................................ 545 Semantisches Ereignis ..................................... 674 SAXBuilder .......................................................... 591 Semaphore, Klasse ............................................. 139 SAXBuilder, Klasse ............................................ 591 SEPTEMBER, Calendar ...................................... 323 SAXParser, Klasse .............................................. 584 Sequence, Klasse ................................................ 642 SCALE_AREA_AVERAGING, Image ............... 927 SequenceInputStream, Klasse ........................ 447 SCALE_DEFAULT, Image .................................. 927 Sequencer ............................................................. 642 SCALE_FAST, Image .......................................... 927 Sequencer, Schnittstelle .................................. 642 SCALE_REPLICATE, Image ............................... 927 Sequenz ....................................................... 176, 183 SCALE_SMOOTH, Image .................................. 927 Serializable, Schnittstelle ................................ 508 Schablonen-Muster .......................................... 443 SerializablePermission .................................. 1366 Schaltjahr ............................................................. 306 serialPersistentFields ....................................... 511 ScheduledThreadPoolExecutor, serialver, Kommandozeilenprogramm ...... 519 Klasse ............................................................ 89, 97 serialVersionUID ................................................ 518 Scheduler ............................................................... 98 Server ................................................................. 1038 Schema ................................................................. 539 Server, Response-Header .............................. 1005 schemagen, JDK-Tool ....................................... 554 ServerSocket, Klasse .......................................... 989 Scherung .............................................................. 941 Service ................................................................ 1221 Schieberegler ...................................................... 733 ServiceLoader, Klasse ......................... 1160, 1221 Schlange ............................................................... 184 Service-Provider .............................................. 1222 Schlüssel .............................................................. 184 Servlet ................................................................ 1080 Schlüsselpaare .................................................. 1369 Servlet-Container ............................................ 1080 Schlüsselspeicher ............................................ 1370 Session, Klasse ...................................... 1021, 1027 Schriftlinie ........................................................... 877 Set, Schnittstelle ........................................ 183, 208 Schwyzerdütsch ................................................. 316 setAttribute(), Files ............................................ 405 Screen_Updater ................................................... 78 setBorder(), JComponent ................................. 699 ScriptEngine, Schnittstelle ........................... 1307 setContentType(), JEditorPane ....................... 692 ScriptEngineManager, Klasse ...................... 1307 setDefaultCloseOperation(), JFrame ... 647, 667 Scriptlet .............................................................. 1105 setDefaultRenderer(), JTable ........................... 800 Scrollable, Schnittstelle ................................... 714 setDoInput(), URLConnection ............... 967, 977 Scrollbar ............................................................... 733 setDoOutput(), URLConnection ........... 967, 977 ScrollPaneLayout, Klasse ................................ 732 setFont(), Graphics ............................................ 878 SECOND, Calendar ............................................. 329 setLayout(), Container ...................................... 717 SecretKey, Schnittstelle ................................. 1375 setLookAndFeel(), UIManager ........................ 830 SecretKeySpec, Klasse .................................... 1377 setModel(), JSpinner .......................................... 787 Secure Hash Algorithm ................................. 1372 setModel(), JTable .............................................. 794 Secure Hash Standard .................................... 1372 setPaint(), Graphics2D ...................................... 897 Secure Sockets Layer ...................................... 1033 setPriority(), Thread ............................................ 87 Security Manager ............................................ 1358 setProperty(), Properties ................................. 243 Security-API ...................................................... 1355 setRenderingHint(), Graphics2D ................... 887 SecurityException ........................................... 1363 setRequestMethod(), HttpURLConnection SecurityManager ............................................. 1125 setRequestProperty(), URLConnection ....... 977 SecurityManager, Klasse ................... 1357–1358 setSize(), Window ............................................... 648 SecurityPermission ........................................ 1366 setText(), JButton ............................................... 677 SeekableByteChannel, Schnittstelle ... 422, 424 setText(), JLabel .................................................. 654 Sekunde ................................................................ 329 setText(), JTextComponent ............................. 685 1428 977 1507.book Seite 1429 Mittwoch, 12. Oktober 2011 12:49 12 Index setUseCaches(), URLConnection .................... 977 SocketPermission ............................................ 1366 setVisible(), Window ......................................... 648 Sockets .................................................................. 983 SGML ...................................................................... 532 SOCKS ................................................................. 1008 SHA ..................................................................... 1372 SoftBevelBorder, Klasse ................................... 699 Shallow Copy ....................................................... 234 Sommerzeitabweichung ................................. 329 Shamir, Adi ....................................................... 1371 sort(), Arrays ....................................................... 264 Shape, Schnittstelle .................................. 886, 888 sort(), Collections .............................................. 264 shared objects .................................................. 1343 SortedMap, Schnittstelle ................................. 230 ShellFolder, Klasse ............................................. 364 SortedSet, Schnittstelle ................................... 216 SHORT, DateFormat .......................................... 348 Sortieren .............................................................. 264 showConfirmDialog(), JOptionPane .... 821–822 Soundbank .......................................................... 641 showInputDialog(), JOptionPane .................. 822 Source, Schnittstelle ......................................... 613 showMessageDialog(), JOptionPane ............ 822 Sourcecode Beautifier .................................... 1408 showOptionDialog(), JOptionPane ............... 822 SpinnerDateModel, Klasse .............................. 788 SHS ...................................................................... 1372 SpinnerListModel, Klasse ................................ 787 Shutdown-Hook ................................................. 173 SpinnerModel, Schnittstelle .......................... 787 Sicherheitsmanager ................. 1357–1358, 1362 Splash-Screen ..................................................... 922 signal(), Condition ............................................. 125 Spring-Framework .......................................... 1221 Signierung .............................................. 1363, 1368 SpringLayout, Klasse ........................................ 717 Simple API for XML Parsing ............................ 545 SQLWarning, Klasse ........................................ 1180 Simple Logging Facade for Java .................. 1323 SQuirreL ............................................................. 1145 Simple Mail Transfer Protocol .................... 1019 SSL ........................................................................ 1033 SimpleDateFormat, Klasse .............................. 346 SSLSocket, Klasse ............................................. 1033 SimpleFileVisitor, Klasse ................................. 413 SSLSocketFactory, Klasse .............................. 1033 SIMPLIFIED_CHINESE, Locale ......................... 310 Stabil sortieren ................................................... 264 SINGLE_INTERVAL_SELECTION, Stabiler Sortieralgorithmus ........................... 267 ListSelectionModel ....................................... 771 Stack ...................................................................... 218 SINGLE_SELECTION, ListSelectionModel .... 771 Stack, Klasse ........................................................ 218 Singleton .............................................................. 282 Standard Generalized Markup Language ... 532 Skalierung ............................................................ 941 Standard MBeans ............................................ 1325 Skipjack .............................................................. 1372 Standard Tag Library ...................................... 1101 Skript-Engine ................................................... 1306 Standard Widget Toolkit ................................. 862 Slash ....................................................................... 358 Standardberechtigungen .............................. 1364 sleep(), Thread ....................................................... 73 StandardCopyOption, Aufzählung ............... 396 SLF4J .................................................................... 1323 Standardserialisierung .................................... 502 Slider, Schieberegler ......................................... 733 Stapelspeicher .................................................... 218 Smart-Card ........................................................ 1368 start(), Thread ....................................................... 66 SMB (Server Message Block) ........................... 378 Statement, Schnittstelle ................................ 1168 SMTP ................................................................... 1019 Statusanzeige ..................................................... 745 SMTP-Server ..................................................... 1020 Statuscode ......................................................... 1003 SOAP ................................................................... 1071 Statuszeile ......................................................... 1002 SOAP Web-Services ......................................... 1058 StAX ....................................................................... 570 SOCK_DGRAM ................................................. 1032 Stellenwertsystem .............................................. 41 SOCK_STREAM ................................................ 1032 Stellvertreterobjekt ............................. 1035, 1044 Socket, Klasse ...................................................... 984 Sternzeit ............................................................... 305 1429 1507.book Seite 1430 Mittwoch, 12. Oktober 2011 12:49 12 Index STL-Bibliothek .................................................... 267 TableModel, Schnittstelle ....................... 791, 803 stop(), Thread ........................................................ 79 TableModelEvent, Klasse ................................. 795 Store-and-Forward .......................................... 1019 TableModelListener, Schnittstelle ................ 791 StreamEncoder ................................................... 491 TableRowSorter, Klasse .................................... 806 StreamFilter, Schnittstelle .............................. 578 Tag ................................................................. 328, 531 StreamTokenizer, Klasse ................................. 526 Tag des Jahres ..................................................... 329 StringReader, Klasse ................................ 439, 465 Tage im Monat .................................................... 333 StringWriter, Klasse .......................................... 463 Tagesdatum ......................................................... 332 Stroke, Schnittstelle .......................................... 908 TagLib ................................................................. 1101 Subject ................................................................ 1368 TagLib-Deskriptor ........................................... 1101 Subprotokoll ..................................................... 1164 TAI .......................................................................... 306 SUID ....................................................................... 519 TAIWAN ................................................................ 310 sun.jdbc.odbc.JdbcOdbcDriver .................... 1161 Tango Desktop Projekt ..................................... 659 sun.nio.cs ............................................................. 491 Tar-Archiv ............................................................ 626 suspend(), Thread ................................................ 87 Task, Fork and Join ............................................ 152 SWIG .................................................................... 1353 Tastatur-Shortcut .............................................. 753 Swing JavaBuilder ............................................. 861 Tastenkürzel ........................................................ 753 swing.properties ................................................ 830 TCP ...................................................................... 1012 SwingUtilities, Klasse ....................................... 849 TCP/IP .................................................................... 983 SwingWorker, Klasse ........................................ 851 Tear-off-Menü ..................................................... 749 SwingWT .............................................................. 863 Teile und herrsche ............................................. 149 SWT ........................................................................ 862 Teletubbies .......................................................... 975 SWTSwing ............................................................ 863 template pattern ................................................ 443 Symbolleiste ....................................................... 756 Template-Code ................................................ 1090 sync() ............................................................ 435–436 Terminiert .............................................................. 76 Synchronisation .................................................. 98 TextArea, Klasse ................................................. 688 synchronized, Schlüsselwort ......................... 113 TextLayout, Klasse ............................................ 885 synchronizedCollection(), Collections ........ 286 TexturePaint ....................................................... 897 synchronizedList(), Collections ..................... 286 Thread, Klasse ....................................................... 66 synchronizedMap(), Collections ................... 286 ThreadDeath, Klasse ........................................... 83 synchronizedSet(), Collections ...................... 286 ThreadGroup, Klasse ......................................... 162 synchronizedSortedMap(), Collections ...... 286 Thread-Gruppe ................................................... 166 synchronizedSortedSet(), Collections ......... 286 Thread-local storage (TLS) ............................... 156 System.in .................................................... 445, 460 ThreadLocal, Klasse ........................................... 156 SystemColor ........................................................ 897 ThreadLocalRandom, Klasse .......................... 161 SystemColor, Klasse ......................................... 903 Thread-lokale Variablen .................................. 156 Systemfarben ..................................................... 903 Thread-Pool ........................................................... 89 SystemTray, Klasse ........................................... 764 ThreadPoolExecutor, Klasse ............................. 89 Thread-safe ............................................................ 99 T Thread-sicher ........................................................ 99 tick marks ............................................................ 733 TableCellEditor, Schnittstelle ........................ 801 Tiefe Objektkopie ............................................... 515 TableCellRenderer, Schnittstelle ................... 798 Timeout ............................................................. 1039 TableColumn, Klasse ........................................ 803 Timer, Klasse ....................................................... 171 TableLayout, Klasse .......................................... 732 Timer, Swing-Klasse ................................. 855–856 1430 1507.book Seite 1431 Mittwoch, 12. Oktober 2011 12:49 12 Index TimerTask, Klasse .............................................. 171 UIDefaults, Klasse ............................................. 656 Timestamp, Klasse .......................................... 1173 UI-Delegate .......................................................... 708 TimeUnit, Aufzählung ...................................... 307 UIManager, Klasse ............................................ 830 Titelleiste .............................................................. 652 UK, Locale ............................................................ 310 TitledBorder, Klasse .......................................... 699 Umrisslinie .......................................................... 908 TLS ....................................................................... 1033 Umrisslinie, Stroke ........................................... 896 toArray(), Collection .......................................... 204 UncaughtExceptionHandler, Schnittstelle .. 81 Tödliche Umarmung ......................................... 119 UNDECIMBER, Calendar .................................. 323 Tomcat ............................................................... 1083 Undo/Redo .......................................................... 842 Toolkit, Klasse ..................................................... 650 UndoableEditEvent, Klasse ............................. 844 Topic, JMS .......................................................... 1055 UndoManager, Klasse ...................................... 842 Top-Level-Container ......................................... 645 UnicastRemoteObject, Klasse ...................... 1048 Transferable, Schnittstelle .............................. 837 Unicast-Verbindung ....................................... 1033 Transfer-Encoding .......................................... 1004 Uniform Resource Locator ............................. 957 TransferHandler, Klasse ................................... 841 Universal Time ................................................... 306 Transfer-Objekt ............................................... 1262 UnknownHostException ................................ 985 Transformation .................................................. 896 unlock(), Lock ..................................................... 106 transient, Schlüsselwort .................................. 511 Unmarshaller, Schnittstelle ........................... 549 translate(), Graphics .......................................... 936 UnsatisfiedLinkError ...................................... 1339 Transparency, Schnittstelle ............................ 897 UnsupportedOperationException ..... 181, 202, TransparentLayout ............................................ 732 251, 271 Transport Layer Security .............................. 1033 Unterlänge .......................................................... 884 Transportschicht ............................................. 1038 Untermenü .......................................................... 748 TrayIcon, Klasse ................................................. 764 Unterstrich TreeMap, Klasse ....................... 176, 185–186, 229 in Zahlen ............................................................ 42 TreeModel, Schnittstelle ......................... 809, 811 Upgrade .............................................................. 1004 TreeNode, Schnittstelle .................................... 811 URI (Uniform Resource Identifier) ............... 957 TreeSelectionListener, Schnittstelle ............. 811 URI, Klasse ........................................................... 957 TreeSet, Klasse .................................................... 214 URL ........................................................................ 958 TrueType-Zeichensatz ...................................... 881 URL, Klasse .......................................................... 958 TrueZIP .................................................................. 626 URLConnection, Klasse .................................... 965 try mit Ressourcen .............................................. 51 URLDecoder, Klasse ................................. 974–975 Tupel ................................................................... 1139 URLEncoder, Klasse .......................................... 974 TYPE, Wrapper-Klasse .................................... 1229 US, Locale ............................................................. 310 TYPE_INT_RGB, BufferedImage ..................... 924 user.timezone .................................................... 324 TYPE_SCROLL_INSENSITIVE, ResultSet .... 1176 UserDefinedFileAttributeView, Types, Klasse .................................................... 1170 Schnittstelle .................................................... 405 tz database ........................................................... 339 UTC ........................................................................ 306 UTF-16 ................................................................... 535 U UTF-8 ..................................................................... 535 UTF-8-Format Überblendung, Grafik ....................................... 907 modifiziertes ................................................... 383 Überwachtes Warten ........................................ 131 UTF-8-Kodierung ............................................... 383 UDP .......................................................... 1011–1012 UUencode .......................................................... 1020 1431 1507.book Seite 1432 Mittwoch, 12. Oktober 2011 12:49 12 Index V Weichzeichnen .......................................... 871, 941 Weld .................................................................... 1224 Valid, XML ........................................................... 535 Well-known System Ports ............................... 984 validateProperty(), Validator ....................... 1210 Wettlaufsituation .............................................. 102 Validation, Klasse ............................................ 1209 WHITE, Color ....................................................... 900 Validator, Schnittstelle .................................. 1209 WIND_NON_ZERO, GeneralPath ................... 893 Value ..................................................................... 184 Winding Rule ...................................................... 892 values(), Map ....................................................... 238 windowClosed(), WindowListener ................ 667 Vary, Response-Header ................................. 1005 windowClosing(), WindowListener .............. 667 Vector, Klasse ..................................................... 188 WindowEvent, Klasse ....................................... 665 Verbindungsloses Protokoll ........................ 1011 WindowListener, Schnittstelle ....................... 662 Verbindungsorientiert .................................. 1011 Windows Icon-Format ...................................... 915 Verkettete Liste ......................................... 177, 200 Windungsregel ................................................... 892 Verklemmung .................................................... 119 Woche .................................................................... 328 Verlaufsbalken ................................................... 745 Woche des Monats ............................................ 328 Verschiebung ...................................................... 941 Wohlgeformt ....................................................... 534 Verzeichnis anlegen ......................................... 365 Word-Dokumente .............................................. 623 Verzeichnis umbenennen .............................. 365 Worker-Thread ................................................... 853 Via ........................................................................ 1004 work-stealing ...................................................... 153 View ....................................................................... 765 writeObject(), ObjectOutputStream ............. 504 ViewPortLayout, Klasse ................................... 732 Writer, Klasse ...................................................... 449 volatile, Schlüsselwort ..................................... 146 writeReplace() ..................................................... 515 Vorschaubild ...................................................... 915 writeUTF(), RandomAccessFile ...................... 382 wsimport, Dienstprogramm ............ 1074, 1076 W Wurzelelement ................................................... 595 Wurzelverzeichnis ............................................. 373 wait(), Object .............................................. 124, 135 WWW-Authenticate, Response-Header .... 1005 Wait-free-Algorithmus .................................... 284 walkFileTree(), Files .......................................... 413 Warning, Response-Header .......................... 1005 X Warning:Applet Window .............................. 1363 X.509 ................................................................... 1369 Watchable, Schnittstelle .................................. 421 XAML ..................................................................... 861 WatchEvent, Klasse ........................................... 421 Xerces .................................................................... 546 WatchKey, Klasse .............................................. 421 XFire, Codehaus ............................................... 1073 WatchService, Klasse ........................................ 420 XHTML .................................................................. 543 WAV ....................................................................... 641 xjc ........................................................................... 565 Web Application Security ............................. 1121 XML ........................................................................ 532 WebApplicationException ............................ 1069 XMLDecoder, Klasse .......................................... 522 Webbrowser ........................................................ 692 XMLEncoder, Klasse .......................................... 522 WebRowSet, Schnittstelle ................. 1183–1184 XMLEvent, Klasse ............................................... 571 Web-Service ...................................................... 1058 XMLEventFactory, Klasse ................................ 579 Webstart ............................................................. 1137 XMLEventReader, Klasse ................................. 576 Wechselknopf ..................................................... 682 XMLEventReader, Schnittstelle ..................... 579 WEEK_OF_MONTH, Calendar ........................ 328 XMLEventWriter, Klasse .................................. 572 WEEK_OF_YEAR, Calendar ............................. 328 XMLEventWriter, Schnittstelle ...................... 580 1432 1507.book Seite 1433 Mittwoch, 12. Oktober 2011 12:49 12 Index XMLGregorianCalendar, Klasse ..................... 562 Z XMLInputFactory, Klasse ................................ 579 XMLOutputFactory, Klasse .................... 579–580 Zehnersystem ....................................................... 41 XMLOutputter, Klasse ...................................... 592 Zeichenbereich ................................................... 896 XMLStreamConstants, Schnittstelle ............ 572 Zeitablauf ........................................................... 1039 XMLStreamReader, Schnittstelle .................. 571 Zeitgenauigkeit .................................................. 317 XMLStreamWriter, Klasse ............................... 572 Zeitzone ....................................................... 306, 351 XMLStreamWriter, Schnittstelle .......... 579–580 Zeitzonenabweichung ..................................... 329 XMLVM .............................................................. 1294 Zertifizierungsstelle ....................................... 1368 XOR ........................................................................ 867 ZipEntry, Klasse ................................................. 633 Xor-Modus, Zeichnen ....................................... 907 ZipFile, Klasse ..................................................... 633 XPath ............................................................ 606, 610 ZONE_OFFSET, Calendar ................................. 329 XPath, Klasse ....................................................... 607 Zugriffsmodifizierer ....................................... 1245 XPath-Wurzel ...................................................... 606 Zustände, Threads ............................................... 72 XSLT ....................................................................... 610 Zwischenablage .................................................. 836 XStream ................................................................ 525 Zyklische Redundanzprüfung ....................... 499 Y YAJSW ................................................................. 1409 YEAR, Calendar ................................................... 328 yield(), Thread ....................................................... 75 1433