zoukankan      html  css  js  c++  java
  • 类加载与动态代理

    动态代理

    所谓动态,就是在运行期间生成代理类。不然,有100个需要被代理的类,你就得手动写100个代理类,代码膨胀得厉害。

    而我现在的目标是弄清楚jdk如何实现动态代理。

    阅读Proxy类的源码能够看清大体流程:

    1、我们自己提供接口和类加载器,然后jdk去通过Class.forName的方式去加载以及初始化这些接口,并生成类型信息。

    2、有了这些接口的类型信息,就可以通过反射得到所有的方法的信息

    3、这个时候有2种选择:通过已有的信息生成代理类的java源代码文件,然后动态编译生成class文件。

    而jdk用的是另一种,将已有信息直接写入class文件。因为class文件的内容分布是固定的,所以按照class文件的格式一个一个的写二进制流就可以实现。

    相比第一种,第二种的效率更高。

    4、有了class文件,就可以调用defineClass方法生成代理类的类型信息

    5、有了代理类的类型信息,就可以通过反射调用参构造方法,把我们自定义的InvocationHandler传进去,生成代理类的实例。

    通过动态代理的实现原理,可以清楚的看到:类加载机制相对灵活,只要你能得到符合规范的class文件,就可以生成对应的类型信息,然后通过反射就可以干很多事情。

    但是动态代理的唯一遗憾是必须要实现接口,而另外还有一种方式---cglib,可以更加灵活的实现动态代理。关于cglib,且听下回分解。

  • 相关阅读:
    舵机驱动-GPIO MG995 STM32
    Ymodem协议-接收
    IAP注意事项
    stm32系统时钟配置,标准库v3.5
    FREERTOS移植(MDK 、STM32F103)
    C语言常量后缀
    回调函数
    运算符记忆口诀
    C语言函数指针
    frp 搭建内网穿透
  • 原文地址:https://www.cnblogs.com/cz123/p/6168571.html
Copyright © 2011-2022 走看看