上一篇文章讲解了静态代理,不难看出,静态代理中的代理者的代码由程序员自己或通过一些自动化工具生成固定的代码再对其进行编译,也就是说在我们的代码运行前代理类的class编译文件就已存在。
动态代理与静态代理相反,通过反射机制动态地生成代理者的对象,也就是说我们在code阶段压根就不需要知道代理谁,代理谁我们将会在执行阶段决定。Java给我们提供了一个便捷的动态代理接口InvocationHandler,只需要实现该接口需要重写其调用方法invoke。
1. 动态代理类
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object,args);
return null;
}
}
以上代码可以看出,我们声明了一个Object的引用,该引用将指向被代理类,而我们调用被代理类的具体方法则在invoke方法中执行,很简洁。也就是说之前我们由律师类来作为代理类,现在我们由InvocationHandler来处理代理工作,之前我们律师类需要实现ILawsuit接口,并实现它的方法,还要声明指向被代理对象的引用mLawyer。也就是说现在DynamicProxy不用关心被代理人的类型,随便谁都行,在代码阶段不需要告诉DynamicProxy要代理谁。
2. 动态代理下的客户端类
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
ILawsuit xiaowang = new XiaoWang();
DynamicProxy proxy = new DynamicProxy(xiaowang);
ClassLoader loader = xiaowang.getClass().getClassLoader();
ILawsuit lawsuit = (ILawsuit) Proxy.newProxyInstance(loader,new Class[]{ILawsuit.class},proxy);
lawsuit.submit();
lawsuit.burden();
lawsuit.defend();
lawsuit.finish();
}
}
从这里可以看出:
- 我这个DynamicProxy动态代理类是万能的,不是只能代理ILawsuit类型的xiaowang,可以是任意类型。也就是说动态代理下的代理者和被代理者进行了解耦,两者没有直接的耦合关系。
- 静态代理动态代理是从code方面来区分代理模式的两种方式。
3. 后续
如果大家喜欢这篇文章,欢迎点赞!
如果想看更多设计模式 方面的文章,欢迎关注!
你的点赞和关注,是对我莫大的支持和鼓励,我将会花更多的时间和精力在分享技术上!
网友评论