JDK动态代理

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

JDK动态代理

简介

在Java中,JDK动态代理是一种基于接口的代理机制。它可以在运行时创建一个符合给定接口的新类(代理类),并将方法调用通过一个统一的处理器(InvocationHandler)进行处理。

实现步骤

1. 定义接口

首先,我们需要定义一个接口,它声明了我们想要代理的方法。

public interface Subject {
    void doAction();
}

2. 创建真实对象

接下来,创建一个实现了Subject接口的真实类,这个类是我们实际想增强行为的类。

public class RealSubject implements Subject {
    @Override
    public void doAction() {
        System.out.println("Performing action in RealSubject");
    }
}

3. 定义调用处理器

定义一个InvocationHandler,用来编写“额外的”或者“统一处理”的代码,它会被代理对象的所有方法调用。

public 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;
    }
}

4. 创建代理对象

最后,我们使用Proxy类和InvocationHandler创建代理对象。所有接口方法的调用都会被动态地委托给InvocationHandler实例。

Subject subjectProxy = (Subject) Proxy.newProxyInstance(
        RealSubject.class.getClassLoader(),
        new Class[]{Subject.class},
        new DynamicProxyHandler(new RealSubject())
);

使用代理对象

使用代理对象和使用任何其他普普通通的对象没什么两样,调用对应的方法即可:

subjectProxy.doAction();
// Output:
// Before method doAction
// Performing action in RealSubject
// After method doAction

这样,我们就通过JDK动态代理机制成功地在不改变原始类RealSubject的基础上,增强了方法的行为。

最后更新于