Kapitel 1 Neues in Java 7

Werbung
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
Herunterladen