设计模式之动态代理
动态代理
静态代理:
需求:在项目现有所有类的方法前后打印日志。
那么我们如何在不修改原来代码的情况下实现这个功能呢?
我们可以先用“静态代理”的方式实现。
-
为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口(假设都有)
-
在创建代理对象时,通过构造器塞入一个目标对象,然后在代理对象的方法内部调用目标对象同名方法,并在调用前后打印日志。也就是说,代理对象 =增强代码 + 目标对象(原对象)。有了代理对象后,就不用原对象了。
缺点:程序员要手动为每一个目标类编写对应的代理类。如果当前系统已经有成百上千个类,工作量太大了。所以,现在我们的努力方向是:如何少写或者不写代理类,却能完成代理功能?
动态代理:
JDK提供了java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy类。
优点:
代码演示动态代理: