学习目标:
1、掌握JDK原生的动态代理的支持
2、了解动态代理的意义
学习过程:
动态代理的目的就是为了解决静态代理的缺点。通过使用动态代理,我们可以通过在运行时,动态生成一个持有Object、并实现代理接口的Proxy,同时注入我们相同的扩展逻辑。哪怕你要代理的Object是不同的对象,甚至代理不同的方法,都可以动过动态代理,来扩展功能。
动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。
动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
我们看到这个方法一共接受三个参数:
proxy:是指我们所代理的那个真实对象
method:是我们所要调用真实对象的某个方法的Method对象
args:指代的是调用真实对象某个方法时接受的参数
Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:
下面我们简单做一个示例:
业务接口:
1 2 3 4 5 6 7 |
|
实现类:
1 2 3 4 5 6 7 8 9 10 |
|
代理控制类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
测试类:
1 2 3 4 5 6 7 8 9 10 |
|
其实有点类似我们在静态代理中提到的方案一,生成了一个包含我们扩展功能,持有RealObject引用,实现Action接口的代理实例Proxy。只不过这个Proxy不是我们自己写的,而是java帮我们生成的,有没有一点动态的味道。