java 动态代理

动态代理是一种运行时多态的处理方式.来看下面的例子可以直观的理解.

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

// 1. 定义接口
interface Subject {
    void request();
}

// 2. 实现接口
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 3. 实现InvocationHandler
class DynamicProxyHandler implements InvocationHandler {
    private final Object target;

    public DynamicProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = method.invoke(target, args); // 调用真实对象的方法
        System.out.println("After method: " + method.getName());
        return result;
    }
}

public class DynamicProxyExample {
    public static void main(String[] args) {
        // 4. 创建代理对象
        RealSubject realSubject = new RealSubject();
        Subject proxyInstance = (Subject) Proxy.newProxyInstance(
                RealSubject.class.getClassLoader(), // 类加载器
                new Class[]{Subject.class},        // 代理类实现的接口
                new DynamicProxyHandler(realSubject) // InvocationHandler
        );

        // 调用代理对象的方法
        proxyInstance.request();
    }
}

输出结果:

Before method: request
RealSubject: Handling request.
After method: request

进行解释:创建一个对象的代理对象,通过代理对象来间接的调用对象的方法或是访问对象的属性,有利于运行时多态的实现.
其中,创建代理对象时传入的第三个参数是一个实现了InvocationHandler接口的类,其中重写了invoke方法.我们间接调用实际对象的方法时,就是通过反射传递给invoke方法来实现的.

posted @ 2025-02-01 16:20  colorfullbz  阅读(39)  评论(0)    收藏  举报