代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种:
静态代理:由程序员创建或特定工具自动生成源码,再对其编辑。在程序运行前,代理类就已经存在了。
ClassA
实现ClassA要操作的方法
ClassB
把ClassA作为参数传递到ClassB中,调用ClassB中方法调用ClassA实现的操作。
ClassTest
new ClassA()
new ClassB(把new ClassA 传递到ClassB中)
分别调用ClassA、ClassB的方法
实现ClassA要操作的方法
ClassB
把ClassA作为参数传递到ClassB中,调用ClassB中方法调用ClassA实现的操作。
ClassTest
new ClassA()
new ClassB(把new ClassA 传递到ClassB中)
分别调用ClassA、ClassB的方法
动态代理:在程序运行时,运用反射机制动态的创建。
JDK动态代理中包含一个类和一个接口:InvocationHandler接口:
public interface InvocationHandler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
参数说明:
Object proxy:指被代理的对象。
Method method:要调用的方法
Object[] args:方法调用时所需要的参数
实现代理方法,必须要实现InvocationHandler接口和invoke方法
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
代理类实现MethodInterceptor 方法,
// 回调方法
public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
}