Java Reference
In-Depth Information
Listing 4.4 zeigt eine statische Proxy-Klasse für unser modifi ziertes Beispiel aus Listing 4.1
(d. h. nach Entfernen der Schnittstelle Counter). Darin sind die beschriebenen Überlegun-
gen umgesetzt. Die Proxy-Klasse ist aus CounterImpl abgeleitet und benötigt kein Attribut,
in dem eine Referenz auf das Server-Objekt gespeichert wird (entsprechend auch keinen
expliziten Konstruktor). Die Methoden add und sub werden überschrieben. Die Delegation
an die Methoden add und sub von CounterImpl erfolgt durch Aufruf von super.add() bzw.
super.sub() .
Listing 4.4 Abgeleitete, statische Proxy-Klasse
package javacomp.basics;
class StaticProxyDerived extends CounterImpl
{
public int add(int i)
{
System.out.println("---> javacomp.basics.CounterImpl.add(" +
i + ")");
int result = super.add(i);
System.out.println("<--- return: " + result);
return result;
}
public int sub(int i)
{
System.out.println("---> javacomp.basics.CounterImpl.sub(" +
i + ")");
int result = super.sub(i);
System.out.println("<--- return: " + result);
return result;
}
}
Mit Hilfe der Refl ection-Klasse Proxy, die im vorhergehenden Abschnitt vorgestellt und
benutzt wurde, ist diese Idee nicht auf dynamische Proxies übertragbar. Wenn nämlich
keine Schnittstelle vorhanden ist und man in Proxy.getProxyClass ein Class-Objekt über-
gibt, das eine Klasse und keine Schnittstelle repräsentiert, wird eine IllegalArgumentExcep-
tion mit der Meldung „is not an interface“ geworfen. Hier stoß en die Refl ection-Klassen, die
Teil des JDK (Java Development Kit) sind, an ihre Grenzen. Die CGLIB (Code Generation
Library) hil uns aber weiter. Mit Hilfe der CGLIB lässt sich tatsächlich eine Proxy-Klasse
durch Vererbung aus einer vorgegebenen Klasse dynamisch erzeugen. Die CGLIB kann in
Form einer Jar-Datei aus dem Internet geladen werden (unter dem Stichwort CGLIB kann
die entsprechende Web-Seite leicht von jeder Suchmaschine gefunden werden). Bitte beach-
ten Sie, dass Sie diese Jar-Datei dann in ihren CLASSPATH einbinden müssen (in Eclipse
über den Menüeintrag „Build Path“).
Die wichtigste Klasse der CGLIB ist die Klasse Enhancer. Sie hat einen parameterlosen Kon-
struktor und eine parameterlose Methode create, die direkt ein Objekt der dynamischen
Proxy-Klasse erzeugt (entspricht der Methode newProxyInstance des vorigen Abschnitts).
Vor dem Aufruf von create kann durch die Methode setSuperclass die Klasse festgelegt
werden, aus der die Proxy-Klasse abgeleitet werden soll. Es können mit setInterfaces auch
mehrere Schnittstellen angegeben werden, die die dynamische Proxy-Klasse implementie-
ren soll. Diese Möglichkeit werden wir im Folgenden nicht verwenden. Ähnlich wie in der
 
Search WWH ::




Custom Search