8. Juli 2014 | 2 min lesezeit

Mehr Schein als Sein: Class-Proxies im Debugger

In Zeiten von Dependency Injection (DI) Frameworks und der Empfehlung, auf die Nutzung von Interfaces zu verzichten, so lange es nur eine Implementierung gibt [1], scheint endgültig das leichtgewichtige Entwicklungs-Modell in der Java Community angekommen zu sein. Doch die Kombination der Beiden birgt die eine oder andere Gefahr, wie man schnell beim Debugging von derartigen Anwendungen feststellen wird.

Viele DI-Frameworks erzeugen für die von ihnen verwalteten Java Objekte Proxies und verwenden diese für den „Injection“-Teil des Frameworks. Die Proxies wiederum delegieren zur Laufzeit Methodenaufrufe an die Zielobjekt-Instanzen, erzeugen ggfs. neue Objektinstanzen und übernehmen zusätzliche Aufgaben (Interceptors, Delegates etc.). In der Praxis funktioniert das alles erstaunlich gut, aber nur so lange, wie man einen Proxy von einem Interface und nicht von einer Klasse in der Hand hat.

Beispiel gefällig? Angenommen ein CDI Bean delegiert einen Aufruf nur zu einem Service, so lange ein internes Flag den Wert false hat. Der Default-Wert für dieses Flag ist true.

Was passiert nun, wenn man sich eine Proxy-Instanz von MyCdiBean im Debugger anschaut, deren Instanzvariable flag den Wert false enthält? Richtig! Der Debugger zeigt – wie im Screenshot zu sehen – als Wert für flag nicht den Instanz-Wert false, sondern den Default-Wert true.

Die Ursache ist leicht erklärt: Ein Proxy von einer Klasse wird im Debugger natürlich immer die Default-Werte der Klasse und nie die konkreten Instanz-Werte darstellen, da der Proxy alle Aufrufe an die Ziel-Instanz delegiert und die eigenen Instanz-Werte nie berücksichtigt.

Mit anderen Worten: Vorsicht bei Proxies von Klassen im Debugger – insbesondere wenn statusvolle Objekt-Instanzen untersucht werden sollen und die Klassennamen auf generierte Klassen hindeuten ($$_javassist_26 im oberen Beispiel).

Achtung: Bis eine allgemeine Lösung im JDK oder in den DI-Frameworks zur Verfügung steht sollten IntelliJ Idea User eine Stimme für dieses Feature (http://youtrack.jetbrains.com/issue/IDEA-88756) abgeben. Danke!

[1] www.adam-bien.com/roller/abien/entry/service_s_new_serviceimpl_why


Keine Kommentare

Kontakt

OPEN KNOWLEDGE GmbH

Standort Oldenburg:
Poststraße 1, 26122 Oldenburg

Standort Essen:
II. Hagen 7, 45127 Essen