更新时间:2022-11-17 10:43:49 来源:极悦 浏览424次
静态代理通常是对原有业务逻辑的扩展。
代理的三要素
通用接口
public interface Action {
public void doSomething();
}
实物
public class RealObject implements Action{
public void doSomething() {
System.out.println("do something");
}
}
代理对象
public class Proxy implements Action {
private Action realObject;
public Proxy(Action realObject) {
this.realObject = realObject;
}
public void doSomething() {
System.out.println("proxy do");
realObject.doSomething();
}
}
通过使用动态Proxy,我们可以在运行时动态生成一个持有RealObject并实现Proxy接口的Proxy,并注入相同的扩展逻辑。
使用动态代理
public class DynamicProxyHandler implements InvocationHandler {
private Object realObject;
public DynamicProxyHandler(Object realObject) {
this.realObject = realObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//Agent extension logic
System.out.println("proxy do");
return method.invoke(realObject, args);
}
}
invoke 方法实现了要扩展的公共函数
public static void main(String[] args) {
RealObject realObject = new RealObject();
Action proxy = (Action) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Action.class}, new DynamicProxyHandler(realObject));
proxy.doSomething();
}
它们之间的区别
静态代理只能用于相应的类。如果有很多类,则需要很多代理。动态代理就是为了弥补静态代理的这一缺陷。通过使用动态Proxy,我们可以在运行时动态生成一个持有RealObject并实现Proxy接口的Proxy,并注入相同的扩展逻辑。即使你要Proxy的RealObject是不同的对象,甚至是不同的方法,你也可以使用动态Proxy来扩展功能。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习