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");
            }
    原文作者:Weechan_
    原文地址: https://www.jianshu.com/p/7c169b930367
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞