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生成代理类

 

运行结果如下

 

使用代理方法执行

 

 

 未完待续 

原文地址:https://www.cnblogs.com/YsirSun/p/14259664.html