静态代理通常是对原有业务逻辑的扩展。
代理的三要素
通用接口
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来扩展功能。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习