Samstag, 11. Februar 2012


Buch-Tipp

Java Reflection in Action

(Link zum Artikel: http://www.entwickler.de/jaxenter//000447)
  • Autor/in: Ira R. Foreman, Nate Foreman
  • Verlag: Manning Publications
  • Seiten: 273
  • erschienen: 2004
  • Preis: € 40,90
  • ISBN: 1-93239-418-4

Das englischsprachige Buch von Ira und Nate Forman aus dem Manning Verlag widmet sich auf knapp 300 Seiten in zehn Kapiteln der Reflection API. Einleitend gehen die Autoren auf die Notwendigkeit für dynamische Aufrufe ein und nutzen diese im zweiten Kapitel "Accessing Fields reflectively" für ein Beispiel zur XML-Serialisierung. Das dritte Kapitel "Dynamic Loading and reflective Construction" schließt die Grundlagen mit dynamischen Klassenladen und das Entwurfsmuster Fabrik ab. Das vierte Kapitel ist zum Teil online unter www.webreference.com/internet/reflection/ abrufbar und veranschaulicht mit UML-Diagrammen die Typen Proxy und InvocationHandler. Wie der Aufruf-Stack interpretiert werden kann, erläutert der anschließende Abschnitt. Als Anwendung nennen die Autoren Logging, Sicherheitsfragen und Kontrollfluss (Rekursion erkennen).

Dass Java-Security 1.2 auf der Basis von Stack-Inspektion arbeitet, erwähnt das Buch leider nicht. Unter www.developer.com/java/ent/print.php/610811 erhalten Sie aber einen Einblick in die interessante Technik. Es ist eben Ansichtssache ist, ob das Kapitel über Classloader in ein Buch über Reflection gehört. Genauso subjektiv ist die Notwendigkeit für einen Klassenlader, der statische Attribute initialisiert. Abschnitt 6.4 zeigt, wie ein Klassenlader aussehen muss, damit Klassen zur Laufzeit ersetzt werden können – ein schönes Beispiel, das die java.lang.reflect.Proxy-Klasse, Klassenlader und Weak References zusammenbringt.

Unter dem Absatz "Reflective Code Generation" habe ich aktuelle Bibliotheken wie CGLIB, Javassist, ASM, BCEL oder Dynclass erwartet, doch einen Kommandozeilenaufruf von javac bekommen. Sicherlich ist Quellcode-Generierung eine nötige Operation für MDA, doch eine Beschreibung und Anwendung einer Template Engine wäre wünschenswert. Gerne hätte ich über einen kompilierten Proxy wie net.sf.cglib.proxy.Proxy gelesen oder über den Bean-Eigenschaftenkopierer net.sf.cglib.beans.BeanCopier, der nicht wie die Commons BeanUtils bei BeanUtils.copyProperties() über Reflection geht – auch eine sehr schöne Reflection-Anwendung. Große Real-Life-Applikationen wie JBoss oder Hibernate zeigen unverblümten Einsatz der dynamischen Bytecode-Generation, was die Autoren in einer bescheidenen Fußnote immerhin erwähnen.

Dass man Quellcode für "Design Patterns" auch generieren kann, zeigt das achte Kapitel. Reflection liest Elemente wie Konstruktoren aus und generiert Singleton, Dekorator und Proxy; die Autoren nennen das "Class-to-Class Transformation". Der generierte Dekorator testet Invarianten, leider fehlt ein Bezug zu modernen AOP Frameworks, die ähnliche Aufgaben standardmäßig mit simplen Interceptoren lösen. Die Autoren stellen uns anschließend Micro-Benchmarks vor und stellen fest, dass ein Aufruf über Reflection 331-mal teurer ist als ein direkter Aufruf. Obwohl der Benchmark auf den ersten Blick einen Geschwindigkeitsverlust attestiert, relativieren die Autoren im nachfolgenden Abschnitt die Bedeutung der Zahlen und bringen eine interessante Anwendung von Amdahls Gesetz. Weitere Themen sind Reflection bei anderen Programmiersprachen und die Eigenschaften von Java 5, auf die das Buch hätte bauen sollen, denn das Reflection API nutzt Java 5-Eigenschaften reichhaltig. Zwar sind Annotationen gut erklärt, doch schade, dass das Annotation Processing Tool unerwähnt bleibt. Insgesamt, betrachtet man vor allem die ersten Kapitel, macht das Buch einen sehr ordentlichen Eindruck und zeichnet mit vielen Details ein gutes Bild des Reflection API; jedes Kapitel im Buch endet mit einem Unterkapitel "Pitfalls" und einer Zusammenfassung. Kapitel eins und fünf sind darüber hinaus online unter www.manning.com/books/forman/chapters zu lesen. Während diese Kapitel für Einsteiger den meisten Gewinn bringen, fehlt Fortgeschrittenen in den übrigen Kapiteln die Tiefe, die ein Spezialbuch über Reflection bringen sollte. Entwickler, die sich erstmalig mit Reflection beschäftigen, finden auch in anderen Quellen eine akzeptable Einführung.

von Christian Ullenboom

Kommentare