一、静态代理
角色分析
- 抽象对象:用抽象类/接口
- 真实角色:被代理的角色
- 代理角色:大刘真实角色,代理后增加附属操作
- 客户:访问代理的人
好处 - 真实角色操作更加纯粹,不用关注公共业务
- 公共业务给代理去做,业务分工
- 公共业务拓展方便管理
缺点:每个真实角色都需要一个代理角色
二、动态代理(代理类自动生成)
原理:反射
方式:1.基于JDK接口 2.基于cglib类 3.基于java字节码javasist
//基于JDK接口
public class xxxProxy implements InvocationHandler{
private Object taget; //真实角色
public void setTarget(Target target){
this.target = target;
}
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass.getClassLoader,target.getClass.getInterfaces(),this);
}
//处理代理实例,返回结果
public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
Object result = method.invoke(target,args);
return result;
}
}
使用
Host host = new Host(); //真实对象
xxx xxx = new xxxProxy(); //还没创建代理对象
xxx.setTarget(host); //使用真实对象
Target proxy = (Target)xxx.getProxy(); //创建代理对象