De acordo com a documentação :
[
java.lang.reflect.
]Proxy
fornece métodos estáticos para a criação de classes e instâncias de proxy dinâmico, e também é a superclasse de todas as classes de proxy dinâmico criadas por esses métodos.
O newProxyMethod
método (responsável por gerar os proxies dinâmicos) possui a seguinte assinatura:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
Infelizmente, isso impede que se gere um proxy dinâmico que estenda uma classe abstrata específica (em vez de implementar interfaces específicas). Isso faz sentido, considerando que java.lang.reflect.Proxy
é "a superclasse de todos os proxies dinâmicos", evitando assim que outra classe seja a superclasse.
Portanto, há alguma alternativa para java.lang.reflect.Proxy
que possa gerar proxies dinâmicos que herdam de uma classe abstrata específica, redirecionando todas as chamadas aos métodos abstratos para o manipulador de invocação?
Por exemplo, suponha que eu tenha uma classe abstrata Dog
:
public abstract class Dog {
public void bark() {
System.out.println("Woof!");
}
public abstract void fetch();
}
Existe uma classe que me permite fazer o seguinte?
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