JDK动态代理的实现-简述

JDK的Proxy实际上是提供了一个缓存机制缓存对应ClassLoader产生的所有代理类

寻找缓存的时候通过ClassLoader以及传入的Interface定位到具体产生的代理类
其实就是两个Map,从Map<ClassLoader,Map<Interfaces,Class>>的映射.
但是实际上他是Map<CacheKey,Map<KeyX,Supplier>>的映射


在缓存中寻找代理类过程

  • 通过ClassLoader生成一个Cachekey(他是一个WeakRef,应该是避免妨碍生成的代理对象的GC。)
  • 通过CacheKey找到第二个映射表Map<Interfaces,Class>
  • 通过KeyFactory根据interfaces的长度生成第二个映射表的Key,他也是WeakRef
  • 获取最终Class对象的工厂,通过工厂去创建获取缓存的对象
  • 使用工厂创建动态代理会将传入的接口做一些校验以及筛选,然后传进C++层里,应该是做一些字节码的操作然后生成一个class进行loadClass,这个class implement了我们传入的接口,因此可以代理类可以代理接口

这个动态代理搞得跟动态语言那样好像类型变来变去的。。,看半天才找到获取Class的缓存的操作
Supplier<V> supplier = valuesMap.get(subKey);
WeakCache中的valuesMaps是第二级映射
这个操作获取的结果有两种可能,第一种是Factory 他 implement 了 Supplier提供了get接口
如果之前获取过Factory,他会将Factory replace成 CacheValue存放Factory生成的动态代理类
而CacheValue也继承了Suppiler还继承了WeakRef,也有get方法。
所以外面在第二次get的时候就拿到缓存的value

 CacheValue<V> cacheValue = new CacheValue<>(value);
            // try replacing us with CacheValue (this should always succeed)
            if (valuesMap.replace(subKey, this, cacheValue)) {
                // put also in reverseMap
                reverseMap.put(cacheValue, Boolean.TRUE);
            } else {
                throw new AssertionError("Should not reach here");
            }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念。代理这个词本身并不是计...
    小李弹花阅读 16,490评论 2 40
  • 回顾: 上一篇代理之JDK动态代理我们了解来JDK动态代理的使用。同样也遗留了两个问题:1、代理对象是怎么生成的?...
    Seetheworl_6675阅读 292评论 1 1
  • 0.前言 在好多框架源码中接触过动态代理,也发现动态有好多种不同的实现,但就是这么常见的特性我居然没有深入解析过,...
    海涛_meteor阅读 531评论 0 0
  • 1.背景 上一节大致介绍了Proxy动态代理的原理,从几个疑问上面分析,这一节介绍一下动态代理的缓存机制。网上的资...
    赤子心_d709阅读 3,020评论 2 7
  • 昨天下午在爱丁堡城堡上俯瞰王子大街,看着看着有个戴圣诞帽的小孩走到我前面站着。目力所及范围内是他头上的圣诞红与整个...
    楚原啊阅读 19,418评论 0 1