动态代理

三、Java的动态代理

1. 代理

张三.租房() --->房东.租房();

张三.租房() --->中介.租房() --->房东.租房();

 

张三.演唱()--->明星.演唱()

张三.演唱()--->经纪人.演唱()--->明星.演唱()

 

代理:当不能、不方便直接调用目标对象时,可以通过代理对象,间接调用目标对象

有两种代理模式:

  • 静态代理(装饰者模式):代理类是提前创建好的。 我们直接创建代理对象,通过代理对象调用目标对象

  • 动态代理:代理类不存在,在程序运行过程,动态生成的代理类、代理类对象。我们再通过代理对象调用目标对象

2. Java的动态代理实现

注意:

  • Java的动态代理Proxy.newProxyInstance方法,是基于接口的动态代理

  • cglib动态代理,是基于子类的

2.1 API

  • java.lang.reflect.Proxy


Object proxyObject = Proxy.newProxyInstance(
ClassLoader loader,
  Class[] interfaces,
  InvocationHandler h
);
  • 返回值:

    • 一定是 接口的一个实现类对象

  • 参数:

    • loader:类加载器

    • interfaces:代理类要实现的接口,注意参数的类型是Class[]

      String[] arr = new String[]{"string1", "string2"};

      Class[] arr = new Class[]{接口名.class, 接口名.class}

    • h:代理类的方法里, 要执行的代码

      • 通常是增强目标对象的方法;控制目标对象的方法执行

      • InvocationHandler接口,通常创建一个匿名内部类


        new InvocationHandler(){
           public Object invoke(Object proxy, Method method, Object[] args){
               //proxy:代理对象
               //method:我们调用的方法Method对象
               //args:我们调用方法时,传递的实参
               
               //写代码:增强目标对象,控制目标对象
               //调用之前,可以增加一些代码
               //调用目标对象的method方法
               //调用之后,可以增加一些代码
               
               //我们调用代理对象时,得到的返回值结果
               return 返回值;
          }
        }

         

posted @ 2019-05-17 10:47  HankPeng  阅读(112)  评论(0编辑  收藏  举报