在介绍动态代理之前,我们先来看看静态代理的实现过程,代理我们可以理解为为其他对象提供一种代理以控制对这个对象的访问。
首先我们创建一个接口:
接下来,我们创建一个实现类:
我们现在要对<code>dog</code>类进行代理,所以需要创建代理类:
下面我们用一个测试类测试一下:
运行结果:
before invoke sleep…
dog sleep…
after invoke sleep…
before invoke run…
dog run…
after invoke run…
静态代理存在大量的重复代码且需要维护多个代理类,维护成本很大,所以使用动态代理是很有必要的。
动态代理需要用到<code>java.lang.reflect.invocationhandler</code>和<code>java.lang.reflect.proxy</code>。
invocationhandler是代理实例的调用处理程序 实现的接口。proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
同样的我们还是以静态代理中的例子来演示动态代理的使用,实现同样的功能,我们可以编写一个类实现<code>invocationhandler</code>接口:
最后,我们编写一个测试类测试一下:
通过对比动态代理与静态代理的实现方式,我们可以发现动态代理更加简洁,更易于维护。
我们可以将动态代理的相关实现提取出来,形成工具类,方便以后使用:
我们可以这样使用工具类
before invoke sleep
after invoke sleep
before invoke run
after invoke run
如果我们想代理指定的方法,我们可以这样去写: