java代理 jdk动态代理应用案列


下面是一个简单的Java JDK动态代理的应用案例。在这个例子中,我们将创建一个接口,一个实现了这个接口的类,然后使用`java.lang.reflect.Proxy`类来创建一个该接口的动态代理实例。这个代理实例将在调用接口方法时添加一些额外的逻辑(比如日志记录)。

首先,定义一个接口:


public interface Subject {
    void request();
}

然后,实现这个接口:


public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

接下来,创建一个实现了`InvocationHandler`接口的类,用于处理代理实例上的方法调用:


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

public class DynamicProxyHandler implements InvocationHandler {
    private Object subject;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在方法调用之前添加日志
        System.out.println("Before method " + method.getName());

        // 调用原始对象的方法
        Object result = method.invoke(subject, args);

        // 在方法调用之后添加日志
        System.out.println("After method " + method.getName());

        return result;
    }
}

最后,我们创建一个客户端类来生成代理实例并调用方法:


import java.lang.reflect.Proxy;

public class ProxyDemo {
    public static void main(String[] args) {
        // 创建原始对象
        RealSubject realSubject = new RealSubject();

        // 创建InvocationHandler,并传入原始对象
        InvocationHandler handler = new DynamicProxyHandler(realSubject);

        // 使用Proxy类生成代理对象
        // 第一个参数是类加载器,第二个参数是接口数组,第三个参数是handler
        Subject proxyInstance = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                new Class[]{Subject.class},
                handler
        );

        // 调用代理实例的方法
        proxyInstance.request();
    }
}

在这个例子中,`RealSubject`类实现了`Subject`接口,并定义了`request`方法的具体实现。`DynamicProxyHandler`类实现了`InvocationHandler`接口,用于在调用`Subject`接口的方法前后添加额外的逻辑(这里是打印日志)。最后,`ProxyDemo`类使用`Proxy.newProxyInstance`方法创建了一个`Subject`接口的动态代理实例,并通过这个代理实例调用了`request`方法。由于调用是通过代理实例进行的,所以`DynamicProxyHandler`中的`invoke`方法会被调用,从而实现了在方法调用前后添加额外逻辑的目的。