Android开发经验谈Java 杂谈Java学习笔记

JDK动态代理的实现-简述

2019-04-04  本文已影响2人  Weechan_

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

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


在缓存中寻找代理类过程


这个动态代理搞得跟动态语言那样好像类型变来变去的。。,看半天才找到获取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");
            }
上一篇 下一篇

猜你喜欢

热点阅读