JDK的Proxy實(shí)際上是提供了一個(gè)緩存機(jī)制緩存對(duì)應(yīng)ClassLoader產(chǎn)生的所有代理類
尋找緩存的時(shí)候通過ClassLoader以及傳入的Interface定位到具體產(chǎn)生的代理類
其實(shí)就是兩個(gè)Map摆舟,從Map<ClassLoader,Map<Interfaces,Class>>的映射.
但是實(shí)際上他是Map<CacheKey,Map<KeyX,Supplier>>的映射
在緩存中尋找代理類過程
- 通過ClassLoader生成一個(gè)Cachekey(他是一個(gè)WeakRef,應(yīng)該是避免妨礙生成的代理對(duì)象的GC。)
- 通過CacheKey找到第二個(gè)映射表Map<Interfaces,Class>
- 通過KeyFactory根據(jù)interfaces的長度生成第二個(gè)映射表的Key,他也是WeakRef
- 獲取最終Class對(duì)象的工廠爽室,通過工廠去創(chuàng)建或獲取緩存的對(duì)象
- 使用工廠創(chuàng)建動(dòng)態(tài)代理會(huì)將傳入的接口做一些校驗(yàn)以及篩選,然后傳進(jìn)C++層里浓若,應(yīng)該是做一些字節(jié)碼的操作然后生成一個(gè)class進(jìn)行l(wèi)oadClass斧蜕,這個(gè)class implement了我們傳入的接口双霍,因此可以代理類可以代理接口
這個(gè)動(dòng)態(tài)代理搞得跟動(dòng)態(tài)語言那樣好像類型變來變?nèi)サ摹!H髡ⅲ窗胩觳耪业将@取Class的緩存的操作
Supplier<V> supplier = valuesMap.get(subKey);
WeakCache中的valuesMaps是第二級(jí)映射
這個(gè)操作獲取的結(jié)果有兩種可能染坯,第一種是Factory 他 implement 了 Supplier提供了get接口
如果之前獲取過Factory,他會(huì)將Factory replace成 CacheValue存放Factory生成的動(dòng)態(tài)代理類
而CacheValue也繼承了Suppiler還繼承了WeakRef丘逸,也有g(shù)et方法单鹿。
所以外面在第二次get的時(shí)候就拿到緩存的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");
}