jdk与cglib代理

234 阅读1分钟

原理:

  • JDK:通过ProxyGenerator的静态方法generateProxyClass生成代理类字节码数据(可保存到硬盘),并生成相应的代理对象;在生成代理对象时会传入拦截器InvocationHandler的实现实例,在调用代理对象方法时,实际调用拦截器对象的invoke方法
  • Cglib:生成代理类及对应的FastClass;在代理类中会获得所有在父类继承来的方法,并会有MethodProxy与之对应,其调用会经过MethodProxyc对象的invokeSuper方法,其目的是通过获取对象的FastClass来执行代理方法。(为代理类和被代理类各生成一个FastClass,其会为代理类或被代理类的方法分配一个index。通过index可以直接定位要调用的方法进行调用,省去反射调用)

区别:

  1. JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象
  2. JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低
  3. JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高