有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
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的基础上,增强了方法的行为。
本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 小朱
评论
隐私政策
0/500
滚动到此处加载评论...


