12-动态代理

 

 

动态代理

项目地址

底层用到反射

  • 动态代理与静态代理角色一样
  • 动态代理的代理类是动态生成,并非我们直接写好
  • 分类:基于接口和基于类的
    • 基于接口——JDK动态代理
    • 基于类——cglib
    • Java字节码实现——javasist

需要了解2个类:

  • Proxy:调用newProxyInstance 方法用于生成代理角色

  • InvocationHandler:重写 invoke 方法,指明代理角色要处理的功能,详细查看项目

    //这是一个用于创建代理角色的类,不是代理类
    public class ProxyInvocationHandler implements InvocationHandler {
    
        //指向被代理的接口(即真实角色)
        private Rent r;
    
        public void setRent(Rent r) {
            this.r = r;
        }
    
        //生成代理角色
        public Object getProxy(){
            return Proxy.newProxyInstance(this.getClass().getClassLoader(), r.getClass().getInterfaces(), this);
        }
    
        @Override
        //处理代理实例(即被代理者),并返回结果
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            seeHouse();
            fare();
            Object result = method.invoke(r, args);
            return result;
        }
    
    

动态代理好处:

  • 可以使真实角色的操作更加纯粹
  • 公共交给代理角色,实现业务分工
  • 公共业务扩展时,方便集中管理
  • 一个动态代理类可以代理多个类(只要实现的是同一个接口即可)
posted @ 2021-08-03 15:08  aJream  阅读(23)  评论(0编辑  收藏  举报