美文网首页
再来了解下动态代理

再来了解下动态代理

作者: 付凯强 | 来源:发表于2019-09-14 10:14 被阅读0次

上一篇文章讲解了静态代理,不难看出,静态代理中的代理者的代码由程序员自己或通过一些自动化工具生成固定的代码再对其进行编译,也就是说在我们的代码运行前代理类的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();
    }
}

从这里可以看出:

  1. 我这个DynamicProxy动态代理类是万能的,不是只能代理ILawsuit类型的xiaowang,可以是任意类型。也就是说动态代理下的代理者和被代理者进行了解耦,两者没有直接的耦合关系。
  2. 静态代理动态代理是从code方面来区分代理模式的两种方式。

3. 后续

如果大家喜欢这篇文章,欢迎点赞!
如果想看更多设计模式 方面的文章,欢迎关注!
你的点赞和关注,是对我莫大的支持和鼓励,我将会花更多的时间和精力在分享技术上!

相关文章

  • 再来了解下动态代理

    上一篇文章讲解了静态代理,不难看出,静态代理中的代理者的代码由程序员自己或通过一些自动化工具生成固定的代码再对其进...

  • AOP——cglib动态代理源码解析

    上一篇分析了使用JDK动态代理的低层实现原理,这次再来看看cglib实现动态代理的原理。 关于JDK动态代理的实现...

  • 对动态代理的理解

    上一篇: 对静态代理的理解接上一篇,学习了静态代理后再来看看动态代理的机制。在上一篇博客中,我们使用静态代理实现了...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • Java Spring中的动态代理cglib

    总结 JDK的动态代理和 Spring中的动态代理cglib区别 JDK 的动态代理 :针对实现了接口的类产生代理...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • Java高级主题(五)——动态代理

    代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...

  • 六大原则 动态代理

    参考 六大原则 代理模式 介绍了三种代理:静态代理、Proxy、cglib java 动态代理详解介绍了动态代理具...

网友评论

      本文标题:再来了解下动态代理

      本文链接:https://www.haomeiwen.com/subject/mgyzhctx.html