java动态代理示例分享


当然,我可以为你提供一个简单的Java动态代理示例。在这个示例中,我们将使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`来创建一个动态代理。

首先,定义一个接口,这个接口将被代理类实现:


public interface Subject {
    void request();
}

然后,实现这个接口的一个真实类:


public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("Calling RealSubject.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;
    }
}

最后,我们使用`Proxy`类来创建一个动态代理对象,并调用它的方法:


import java.lang.reflect.Proxy;

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

        // 创建处理器
        DynamicProxyHandler handler = new DynamicProxyHandler(realSubject);

        // 获取被代理对象的类加载器
        ClassLoader classLoader = realSubject.getClass().getClassLoader();

        // 获取被代理对象实现的接口数组
        Class<?>[] interfaces = realSubject.getClass().getInterfaces();

        // 创建动态代理对象
        Subject subjectProxy = (Subject) Proxy.newProxyInstance(
            classLoader,
            interfaces,
            handler
        );

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

在这个示例中,当调用`subjectProxy.request()`时,实际上会先调用`DynamicProxyHandler`的`invoke`方法,在`invoke`方法中我们可以添加任何自定义的逻辑,然后调用真实对象的方法。这样就实现了在不修改真实类代码的情况下,为其添加额外的功能。