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,且听下回分解。

  • 相关阅读:
    只会写“Hello World”的菜鸟心声
    新的旅程
    生成[1,2,,3,4,5,6,7,8,9]的随机数组?
    计算java集合中自定义对象出现的次数
    iOS https 证书信任漏洞解决办法
    自定义 URL Scheme 完全指南
    Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    url schemes格式错误
    给UITapGestureRecognizer添加tag
    iOS GIF 格式动画 图片显示
  • 原文地址:https://www.cnblogs.com/cz123/p/6168571.html
Copyright © 2011-2022 走看看