Laut Dokumentation :
[
java.lang.reflect.
]Proxy
bietet statische Methoden zum Erstellen dynamischer Proxyklassen und -instanzen und ist außerdem die Oberklasse aller dynamischen Proxyklassen, die mit diesen Methoden erstellt wurden.
Die newProxyMethod
Methode (die für die Generierung der dynamischen Proxys verantwortlich ist) hat die folgende Signatur:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
Leider verhindert man von einem dynamischen Proxy erzeugen , die sich eine bestimmte abstrakte Klasse ( und nicht der Umsetzung spezifische Schnittstellen). Dies ist sinnvoll, wenn java.lang.reflect.Proxy
man bedenkt, dass es sich um die "Oberklasse aller dynamischen Proxys" handelt, wodurch verhindert wird, dass eine andere Klasse die Oberklasse ist.
Gibt es daher Alternativen dazu java.lang.reflect.Proxy
, die dynamische Proxys generieren können, die von einer bestimmten abstrakten Klasse erben und alle Aufrufe der abstrakten Methoden an den Aufrufhandler umleiten ?
Angenommen, ich habe eine abstrakte Klasse Dog
:
public abstract class Dog {
public void bark() {
System.out.println("Woof!");
}
public abstract void fetch();
}
Gibt es eine Klasse, in der ich Folgendes tun kann?
Dog dog = SomeOtherProxy.newProxyInstance(classLoader, Dog.class, h);
dog.fetch(); // Will be handled by the invocation handler
dog.bark(); // Will NOT be handled by the invocation handler
quelle
proxyFactory.setHandler()
ist veraltet. Bitte benutzenproxy.setHandler
.In einem solchen Fall können Sie einen Proxy-Handler verwenden, der Aufrufe an vorhandene Methoden Ihrer abstrakten Klasse umleitet.
Sie müssen es natürlich codieren, aber es ist ganz einfach. Um Ihren Proxy zu erstellen, müssen Sie ihm einen geben
InvocationHandler
. Sie müssen dann nur noch den Methodentyp in derinvoke(..)
Methode Ihres Aufrufhandlers überprüfen . Beachten Sie jedoch, dass Sie den Methodentyp anhand des zugrunde liegenden Objekts überprüfen müssen, das Ihrem Handler zugeordnet ist, und nicht anhand des deklarierten Typs Ihrer abstrakten Klasse.Wenn ich als Beispiel Ihren Hund Klasse nehmen, Ihr Aufruf Handler Aufrufmethode kann wie folgt aussehen (mit einer vorhandenen zugehörigem Hund Unterklasse genannt .. na ja ...
dog
)Es gibt jedoch etwas, das mich immer wieder wundert: Ich habe über ein
dog
Objekt gesprochen. Da die Dog-Klasse jedoch abstrakt ist, können Sie keine Instanzen erstellen, sodass vorhandene Unterklassen vorhanden sind. Wie eine strenge Überprüfung des Proxy-Quellcodes zeigt, können Sie (unter Proxy.java:362) feststellen, dass es nicht möglich ist, einen Proxy für ein Klassenobjekt zu erstellen, das keine Schnittstelle darstellt.Abgesehen von der Realität ist das, was Sie tun möchten, durchaus möglich.
quelle
Dog
(zum Beispiel schreibe ich nicht explizit einePoodle
Klasse, die implementiertfetch()
). Daher gibt es keinedog
Variable, mit der die Methoden aufgerufen werden können ... Entschuldigung, wenn ich verwirrend bin, muss ich mir das etwas genauer überlegen.java.lang.reflect.Proxy
) gibt, die das tut, was ich brauche.