返回

代理模式:动态代理 - 揭开幕后的奥秘

后端

导言

在面向对象编程 (OOP) 中,代理模式是一种设计模式,它允许你为另一个对象创建代理或替身。这个代理充当实际对象的接口,并控制对它的访问。代理模式广泛用于各种场景,例如:

  • 远程访问
  • 访问控制
  • 缓存

动态代理

动态代理允许你在运行时 创建代理。这意味着你可以在不创建实际代理类的情况下创建代理。这可以通过使用 Java 中的 ProxyInvocationHandler 类来实现。

Proxy 类

Proxy 类提供创建动态代理类和实例的静态方法。所有通过这些方法创建的动态代理类的超类都为 Proxy 类。它提供了创建和处理代理对象所需的基本功能。

InvocationHandler 接口

InvocationHandler 接口定义了一个方法 invoke,用于处理对代理对象方法的调用。它接收以下参数:

  • proxy:正在调用的代理对象
  • method:正在调用的方法
  • args:传递给方法的参数

invoke 方法负责将调用委托给实际对象或执行其他操作。

实现动态代理

让我们通过一个实际示例来了解如何在 Java 中实现动态代理:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Subject {
    void doSomething();
}

class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject: Doing something...");
    }
}

class ProxySubject implements InvocationHandler {
    private Subject subject;

    public ProxySubject(Subject subject) {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("ProxySubject: Before method call...");
        Object result = method.invoke(subject, args);
        System.out.println("ProxySubject: After method call...");
        return result;
    }
}

public class Main {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();
        Subject proxy = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                new ProxySubject(realSubject)
        );

        proxy.doSomething();
    }
}

在这个示例中:

  1. 我们定义了一个 Subject 接口,它有一个 doSomething 方法。
  2. 我们实现了一个 RealSubject 类,它实现了 Subject 接口。
  3. 我们定义了一个 ProxySubject 类,它实现 InvocationHandler 接口。ProxySubject 是动态代理的处理程序。
  4. main 方法中,我们创建一个 RealSubject 实例和一个动态代理。
  5. 然后我们调用 doSomething 方法,该方法实际上由 ProxySubject 处理。

结论

动态代理提供了在运行时创建代理对象的强大机制。它允许我们在不需要创建实际代理类的情况下扩展或控制对对象的访问。通过理解 ProxyInvocationHandler 类的工作原理,Java 开发人员可以有效地利用动态代理模式来解决各种问题。