Java Reference
In-Depth Information
mit Refl ection erzeugten dynamischen Proxy-Klasse werden in allen Methoden der Proxy-
Klasse die Aufrufe delegiert. Das Objekt, an das delegiert wird, kann mit der Enhancer-
Methode setCallback festgelegt werden, das die Schnittstelle MethodInterceptor implemen-
tieren sollte:
package net.sf.cglib.proxy
import java.lang.reflect.Method;
public interface MethodInterceptor extends Callback
{
public Object intercept(Object proxy,
Method m,
Object[] args,
MethodProxy mProxy)
throws Throwable;
}
Die ersten drei Argumente der Methode intercept entsprechen denjenigen der Methode
invoke der Schnittstelle InvocationHandler aus der Refl ection-Bibliothek (siehe Abschnitt
4.2). Der Typ des vierten Parameters ist MethodProxy. MethodProxy ist eine Klasse aus der
CGLIB, die vergleichbar ist mit der Klasse Method aus der Refl ection-Bibliothek. Zusätzlich
zu der Methode invoke besitzt MethodProxy allerdings noch die Methode invokeSuper (mit
denselben Argumenten wie invoke), mit der die überschriebene Methode der Basisklasse
aufgerufen werden kann. Die Methode invokeSuper ist genau für den Fall vorgesehen, dass
das MethodInterceptor-Objekt zum Weiterleiten des Methodenaufrufs an die „eigentliche“
Methode das dynamische Proxy-Objekt verwendet, da dieses die gewünschte Methode in
überschriebener Form mitbringt (bei der statischen Proxy-Klasse in Listing 4.4 wurde die
„eigentliche“ Methode auch über super aufgerufen). Der dynamische Proxy ist damit gleich-
zeitig auch wieder der Server (so wie zuvor der statische Proxy auch der Server war). Bild
4.5 veranschaulicht diese Situation.
invoke
Dynamic
Proxy/
Server
Method-
Interceptor-
Impl.
m
Bild 4.5 Strukturbild für einen
mit der CGLIB erzeugten
DynamicProxy
Client
super.m
Selbstverständlich könnte man alternativ mit einem dynamischen Proxy, der mit Hilfe der
CGLIB erzeugt wurde, auch das Szenario aus Bild 4.4 umsetzen. Für unser CounterImpl-
Beispiel orientieren wir uns in Listing 4.5 aber an Bild 4.5.
Listing 4.5 Beispiel für einen mit der CGLIB dynamisch erzeugten Proxy
package javacomp.basics;
import java.lang.reflect.*;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
class MyMethodInterceptor implements MethodInterceptor
{
public Object intercept(Object target,
 
Search WWH ::




Custom Search