Java Reference
In-Depth Information
CounterImpl dynamicProxy =
(CounterImpl) enhancer.create();
useCounter(dynamicProxy);
}
catch(Exception e)
{
System.out.println("exception: " + e.getMessage());
}
}
}
Bitte beachten Sie die Anweisung alternativeMethod.invokeSuper(target, args)
in der Methode intercept der Klasse MyMethodInterceptor. Der Parameter target ist eine
Referenz auf den dynamischen Proxy. Auf diesem Objekt wird die überschriebene Methode
der Basisklasse aufgerufen.
Noch ein ganz wichtiger Hinweis, falls Sie den Code aus Listing 4.5, den Sie auf der Web-
Seite zum Buch fi nden, tatsächlich ausführen wollen: Sie müssen dazu die Sichtbarkeit der
Klasse CounterImpl aus Listing 4.1 auf public ändern, was zur Folge hat, dass Sie Counter-
Impl in eine eigene Datei mit dem Namen CounterImpl.java auslagern müssen. Andernfalls
wird beim Aufruf der Methode create auf dem Enhancer-Objekt die Ausnahme CodeGenera-
tionException ausgelös t .
Logischerweise können Klassen, für die das Ableiten durch das Schlüsselwort fi nal verbo-
ten ist, nicht als Basisklassen einer dynamischen Proxy-Klasse verwendet werden. Wenn
man es versucht, wird die Ausnahme IllegalArgumentException beim Aufruf von create
geworfen (mit der Meldung „Cannot subclass fi nal class“). Kein Problem stellen jedoch
Methoden der Basisklasse dar, die fi nal sind. Diese werden einfach nicht überschrieben. Sie
können das für unser CounterImpl-Beispiel leicht ausprobieren: Machen Sie z. B. in der
Klasse CounterImpl die Methode add fi nal, dann werden nur die Aufrufe von sub protokol-
liert, aber nicht mehr die von add, denn für sub wird die überschriebene Proxy-Methode
aufgerufen, während add nicht überschrieben ist und somit die Methode add von Counter-
Impl direkt aufgerufen wird.
Wie eingangs des Kapitels schon erwähnt wurde, ist die aspektorientierte Programmierung
ein Einsatzgebiet für dynamische Proxies. Bei der aspektorientierten Programmierung wird
zusätzlicher Programmcode um Methoden „herumgewoben“. Dies wird mit Hilfe dynami-
scher Proxies realisiert, wobei sowohl Refl ection als auch CGLIB zum Einsatz kommen.
 
Search WWH ::




Custom Search