Secondo la documentazione :
[
java.lang.reflect.
]Proxy
fornisce metodi statici per la creazione di classi e istanze proxy dinamiche ed è anche la superclasse di tutte le classi proxy dinamiche create da questi metodi.
Il newProxyMethod
metodo (responsabile della generazione dei proxy dinamici) ha la seguente firma:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
Sfortunatamente, questo impedisce di generare un proxy dinamico che estende una specifica classe astratta (piuttosto che implementare interfacce specifiche). Questo ha senso, considerando che java.lang.reflect.Proxy
è "la superclasse di tutti i proxy dinamici", impedendo così a un'altra classe di essere la superclasse.
Pertanto, esistono alternative a java.lang.reflect.Proxy
che possono generare proxy dinamici che ereditano da una specifica classe astratta, reindirizzando tutte le chiamate ai metodi astratti al gestore di invocazione?
Ad esempio, supponiamo di avere una classe astratta Dog
:
public abstract class Dog {
public void bark() {
System.out.println("Woof!");
}
public abstract void fetch();
}
C'è una classe che mi permette di fare quanto segue?
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