动态代理经常用于装饰器、适配器设计模式中。 动态代理提供了一种替代方法,实现许多常见的设计模式如Facade门面模式、Bridge桥接模式、Interceptor解释器模式、Decorator装饰器模式、Proxy代理模式和Adapter适配器模式的动态实现。 尽管这些设计模式使用普通的类也能简单的实现,但是在大都数情况下,使用动态代理方式更加方便、更紧凑,可以消除许多手写的或生成的代码。
JDK动态代理是基于接口实现的(后文解释),需要实现java.lang.reflect.InvocationHandler
这个接口:
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
参考: org.byron4j.cookbook.javacore.dynamicproxy.jdkproxy.JDKDynamicProxy
-
JDK动态代理: 利用反射原理,动态的生成代理类,将类的载入延迟到程序执行之中,解耦了代理类和被代理类的联系.主要要实现InvationHandler接口.
-
CGLIB动态代理:原理是继承,把被代理类作为父类,动态生成被代理类的子类,三个步骤,设置父类,设置回调函数,创建子类.实现MethodInterceptor 接口,拦截调用父类方法时,会处理回调方法,处理自己的增强方法.
参考资料:
- Decorating with dynamic proxies: https://www.ibm.com/developerworks/library/j-jtp08305/index.html