根据the documentation的说法
java.lang.reflect.Proxy
提供了用于创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。
newProxyMethod
method (负责生成动态代理)具有以下签名:
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
发布于 2010-07-20 23:46:05
在这种情况下,您可以使用代理处理程序将调用重定向到抽象类的现有方法。
当然,您必须对其进行编码,但是它非常简单。为了创建你的代理,你必须给他一个InvocationHandler
。然后,您只需检查调用处理程序的invoke(..)
方法中的方法类型。但请注意:您必须根据与处理程序关联的底层对象检查方法类型,而不是检查抽象类的声明类型。
如果我以您的狗类为例,您的调用处理程序的方法可能如下所示(带有一个名为..的现有关联狗子类)。嗯……dog
)
public void invoke(Object proxy, Method method, Object[] args) {
if(!Modifier.isAbstract(method.getModifiers())) {
method.invoke(dog, args); // with the correct exception handling
} else {
// what can we do with abstract methods ?
}
}
但是,有一件事让我感到疑惑:我谈到的是一个dog
对象。但是,由于Dog类是抽象的,您不能创建实例,因此您有现成的子类。此外,正如对代理源代码的严格检查所揭示的那样,您可能会发现(在Proxy.java:362上)不可能为不表示接口的类对象创建代理。
因此,除了reality之外,您想要做的事情是完全可能的。
https://stackoverflow.com/questions/3291637
复制相似问题