当前位置: 首页 > 面试题库 >

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

傅穆冉
2023-03-14
问题内容

根据文档:

[ 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

问题答案:

可以使用Javassist(请参见ProxyFactory)或CGLIB来完成。

亚当使用Javassist的示例:

我(Adam Paynter)使用Javassist编写了以下代码:

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Dog.class);
factory.setFilter(
    new MethodFilter() {
        @Override
        public boolean isHandled(Method method) {
            return Modifier.isAbstract(method.getModifiers());
        }
    }
);

MethodHandler handler = new MethodHandler() {
    @Override
    public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
        System.out.println("Handling " + thisMethod + " via the method handler");
        return null;
    }
};

Dog dog = (Dog) factory.create(new Class<?>[0], new Object[0], handler);
dog.bark();
dog.fetch();

产生以下输出:

纬!
通过方法处理程序处理公共抽象void mock.Dog.fetch()


 类似资料:
  • 问题内容: 在Java中,您可以创建一个仅包含抽象方法的抽象类。另一方面,您可以创建一个声明相同方法的接口。在这种情况下,可以使用抽象类代替接口吗? 问题答案: 不总是: 一堂课只能延伸 一 堂课 一个类可以实现 多个 接口 Sun文档 进行了更详细的比较: 抽象类与接口 与接口不同,抽象类可以包含非静态和最终字段,并且可以包含已实现的方法。此类抽象类与接口相似,不同之处在于它们提供了部分实现,将

  • 问题内容: 我试图通过FOP渲染大约100,000-80列记录,并且每次都几乎耗尽(OutOfMemoryException)。我知道iText可以处理这种负载,但是由于LGPL许可证,我无法使用它。iText是否有其他Java库可以处理将大量数据呈现为PDF的问题? 问题答案: 有商业PDF生成库,例如BFO和ElegantJ。如果您需要开源,则有PDFBox,但我不知道它是否已准备好投入生产。

  • 问题内容: 我正在使用Python的xml minidom,并且一切正常,除了在文本序列中它写出转义字符而不是。如果引号出现在标签中,这当然是有道理的,但它使我在文本中感到困惑。我该如何改变? 问题答案: 查看源代码(如果需要的话,则为Python 3.2),这在_write_data()函数中进行了硬编码。您将需要修改TextNode的writexml()方法-通过对其进行子类化或简单地对其进行

  • 无效: 有效: (运输是抽象的) 顺便说一句,我的所有jaxb类都在同一个包中,并且我的JaxbContext是针对这个包配置的。

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认