首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java.lang.reflect.Proxy的替代方案,用于创建抽象类的代理(而不是接口)

java.lang.reflect.Proxy的替代方案,用于创建抽象类的代理(而不是接口)
EN

Stack Overflow用户
提问于 2010-07-20 23:31:01
回答 1查看 46.9K关注 0票数 96

根据the documentation的说法

java.lang.reflect.Proxy提供了用于创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。

newProxyMethod method (负责生成动态代理)具有以下签名:

代码语言:javascript
复制
public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                             throws IllegalArgumentException

不幸的是,这阻止了生成扩展特定抽象类的动态代理(而不是实现特定接口)。考虑到java.lang.reflect.Proxy是“所有动态代理的超类”,这是有意义的,从而防止另一个类成为超类。

因此,有没有java.lang.reflect.Proxy的替代方案可以生成从特定抽象类继承的动态代理,将对抽象方法的所有调用重定向到调用处理程序?

例如,假设我有一个抽象类Dog

代码语言:javascript
复制
public abstract class Dog {

    public void bark() {
        System.out.println("Woof!");
    }

    public abstract void fetch();

}

有没有一个类可以让我做下面的事情?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2010-07-20 23:46:05

在这种情况下,您可以使用代理处理程序将调用重定向到抽象类的现有方法。

当然,您必须对其进行编码,但是它非常简单。为了创建你的代理,你必须给他一个InvocationHandler。然后,您只需检查调用处理程序的invoke(..)方法中的方法类型。但请注意:您必须根据与处理程序关联的底层对象检查方法类型,而不是检查抽象类的声明类型。

如果我以您的狗类为例,您的调用处理程序的方法可能如下所示(带有一个名为..的现有关联狗子类)。嗯……dog)

代码语言:javascript
复制
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之外,您想要做的事情是完全可能的。

票数 -8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3291637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档