• jdk动态代理和cglib动态代理


    代理模式

    代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的返问。代理类负则为委托类预处理信息,过滤信息并转发信息,以及消费被委托类处理后的后续处理。

    Jdk动态代理

    Jdk动态代理的实质是java自己创建一个动态的代理类,这个代理类继承了被代理类的全部接口,所以jdk动态代理的前提是被代理对象必须实现了接口。我们在调用代理对象的方法时实际上是调用的被代理对象的方法,并在invoke方法中对其进行增强。

    Java动态代理类位于java.lang.reflect包下,一般设计到以下主要两个类:

    1. Interface InvocationHandler

    该接口只定义了一个方法,此方法是代理增强的关键方法。

     

    第一个参数是代理对象本身,第二个参数是被代理的方法,第三个参数第二个参数中方法的参数数组。我们需要在代理处理工具类中实现这个抽象方法。

    1. Class proxy

    该类是一个动态代理工具类,具体的类结构图如下

     

    例子

     

     

     

    前两个是被代理类,后面是对被代理类的增强类,最后调用Proxy的方法获得动态代理对象,然后调用sleep方法,结果如下:

     

    继续往下看

     

    代理对象包含了被代理对象的增强类,而增强类的对象又包含了被代理对象。另外jdk动态代理名命是以$proxy加数字组合的形式命名。

    Cglib动态代理

    首先是cglib动态代理是无法代理final修饰的方法的。其次jdk动态代理是代理类和被代理类实现共同的接口,而cglib动态代理是通过继承被代理类,然后重写方法。

    Jdk动态代理是通过Proxy类生成代理类,而cglib也提供了一个这样的类,Enhancer

    Jdk动态代理是提供实现InvocationHandler接口,而cglib也提供了一个类似的类,MethodInterceptor方法拦截器。

    因为cglib需要其他依赖类,所以这里新建一个maven项目,并导入maven依赖

     

    因为不是依赖接口来实现动态代理,而是针对无接口的类做动态代理,这里实现一个类father

     

    先看一下方法拦截器的注释,就大概理解了这个cglib怎么样一个原理了

     

    然后建立一个方法拦截器,首先我们先看下里面每个参数分别是什么

     

    最后使用Enhancer生成代理类

     

    运行结果如下

     

    使用代理方法执行

     

     

     未完待续 

  • 相关阅读:
    luogu P3704 [SDOI2017]数字表格
    「雅礼集训 2018 Day4」Magic(分治NTT)
    「清华集训 2017」小 Y 和恐怖的奴隶主
    [WC2019]数树(树形dp+多项式exp)
    「FJWC2020Day5-zzq」lg (容斥)
    BoundedOptimization TopCoder
    MapGuessing TopCoder
    线性递推(Berlekamp-Massey 算法)
    杜教筛小记
    「余姚中学 2019 联测 Day 6」解码
  • 原文地址:https://www.cnblogs.com/YsirSun/p/14259664.html
Copyright © 2020-2023  润新知