Java Reference
In-Depth Information
Die programmtechnische Umsetzung der in Bild 4.4 dargestellten Situation erfolgt in drei
Schritten:
1. Die Erzeugung der dynamischen Proxy-Klasse erfolgt durch Aufruf der statischen
Methode getProxyClass der Klasse Proxy aus dem Refl ection-Package:
package java.lang.reflect;
public class Proxy
{
public static Class<?> getProxyClass(ClassLoader loader,
Class<?>... interfaces)
throws IllegalArgumentException
{...}
//weitere Methoden:
...
}
Als Parameter müssen ein ClassLoader sowie die zu implementierenden Schnittstellen in
Form von Class-Objekten angegeben werden. Dass man einen ClassLoader angeben muss,
wo doch gar keine Klasse geladen, sondern dynamisch erzeugt wird, mag merkwürdig
erscheinen. Die Begründung dafür ist, dass eine Klasse nur zusammen mit ihrem ClassLoa-
der-Objekt eindeutig ist. Sollte Ihnen diese Erläuterung unzureichend sein, so vertröste ich
Sie auf das folgende Kapitel, in dem das Thema ausführlicher behandelt wird. Im nachfol-
genden Beispiel wird ohne weitere Erklärung der SystemClassLoader verwendet, den man
durch ClassLoader.getSystemClassLoader() bekommt. Falls die drei Punkte beim
zweiten Parameter nicht geläufi g sein sollten, sei erwähnt, dass es sich hierbei um das
Varargs-Sprachkonstrukt von Java handelt. Es bedeutet, dass man beim Aufruf beliebig
viele Class-Argumente oder alternativ ein Feld von Class-Objekten angeben kann (die wei-
ter unten vorkommenden drei Punkte sind dagegen kein Java-Sprachkonstrukt, sondern sie
sollen anzeigen, dass an dieser Stelle weiterer Programmcode folgt, der nicht angegeben
ist). Die Methode getProxyClass liefert das Class-Objekt zurück, das die dynamisch erzeugte
Proxy-Klasse repräsentiert.
2. Um ein Objekt der dynamisch erzeugten Klasse anzulegen, kann man nicht die Methode
newInstance auf das von getProxyClass zurückgelieferte Class-Objekt anwenden, da diese
Klasse keinen parameterlosen Konstruktor besitzt. Man benötigt einen Konstruktor, der
einen Parameter des Typs InvocationHandler hat. Dieser Konstruktor lässt sich über Refl ec-
tion leicht beschaff en.
3. Im letzten Schritt muss man dann auf den in Schritt 2 bescha en Konstruktor die
Methode newInstance anwenden. Als Parameter übergibt man ein Object-Feld der Länge 1,
das ein Objekt einer Klasse enthält, die die Schnittstelle InvocationHandler implementiert.
Da man in der Regel mit dem Class-Objekt für die dynamische Proxy-Klasse allein nichts
anfangen kann, sondern immer ein Objekt davon braucht, bietet die Klasse Proxy eine wei-
tere statische Methode an, die die drei Schritte zusammenfasst:
package java.lang.reflect;
public class Proxy
{
public static Object newProxyInstance(Classloader cl,
 
Search WWH ::




Custom Search