Згідно з документацією :
[
java.lang.reflect.]Proxyнадає статичні методи для створення динамічних проксі-класів та примірників, а також є суперкласом усіх динамічних проксі-класів, створених цими методами.
newProxyMethodМетод (відповідає за генерацію динамічних проксі) має такий підпис:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
На жаль, це заважає генерувати динамічний проксі, який розширює певний абстрактний клас (а не реалізує конкретні інтерфейси). Це має сенс, враховуючи, що java.lang.reflect.Proxyце «суперклас усіх динамічних проксі», тим самим заважаючи іншому класу бути суперкласом.
Отже, чи існують альтернативи, java.lang.reflect.Proxyякі можуть генерувати динамічні проксі-сервери, які успадковуються від певного абстрактного класу, перенаправляючи всі виклики до абстрактних методів до обробника виклику?
Наприклад, припустимо, у мене є абстрактний клас Dog:
public abstract class Dog {
public void bark() {
System.out.println("Woof!");
}
public abstract void fetch();
}
Чи є клас, який дозволяє мені робити наступне?
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