动态代理设计模式

Posted xianshiwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理设计模式相关的知识,希望对你有一定的参考价值。

通过JDK实现动态代理

如果要实现动态代理,那么你要编写的那个代理类就需要实现一个InvocationHandle接口

java.lang.reflect.InvocationHandler.看到reflect我们就能知道,动态代理肯定是通过反射来实现的了,这个接口中有一个方法:

    Object  invoke(Object proxy, Method method, Object[] args)    :在代理实例上处理方法调用并返回结果。

    invoke方法其实是反射里边的一个方法,在这个方法中有三个参数:

    Ojbect proxy:表示需要代理的对象

    Method method:表示要操作的方法

    Object[] args:method方法所需要传入的参数(可能没有为,null.也可能有多个)

  如果要想让代理设计真正可用,我们还必须有一个代理类对象产生,这有用到了另一个类:java.lang.reflect.Proxy.我的中文jdk文档对他的描述是:

 Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 

  在这个类下面,我们找到了这样一个方法:

  public static Object newProxyInstance(ClassLoader loader,
                                       Class<?>[] interfaces,
                                       InvocationHandler h)
                                  throws IllegalArgumentException

  该方法返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序.方法中有三个参数:

   参数:

     loader - 定义代理类的类加载器

     interfaces - 代理类要实现的接口列表

     h - 指派方法调用的调用处理程序

   返回:

    一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口 

动态代理实现代码:

技术分享图片

测试类:

技术分享图片

 

动态代理和静态代理相比较,最大的好处就是接口中声明的所有的方法都被转移到一个集中的方法中去处理,就是invocke()方法.这样在接口中声明的方法比较多的情况下我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。

      动态代理只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法的返回值是被代理接口的一个实现类。

  那么有没有可能我们可以不依赖接口呢?这时候就需要CGLIB实现动态代理了

本文转载:https://www.cnblogs.com/fingerboy/p/5335328.html

通过CGLIB实现动态代理

 



以上是关于动态代理设计模式的主要内容,如果未能解决你的问题,请参考以下文章

代理模式(静态代理动态代理)代码实战(详细)

代理模式(动态)

动态代理模式

动态代理模式

设计模式----代理模式

#yyds干货盘点# 设计模式之代理模式:动态代理