JDK动态代理之 WeakCache 篇

本文深入探讨JDK动态代理,重点关注WeakCache的实现原理。通过分析WeakCache的成员变量、构造器及get方法,揭示其线程安全机制。二级缓存使用Factory实例,基于ClassLoader和接口数组生成key,保证高效查找。Factory的get方法确保线程安全,最终由ProxyClassFactory生成代理类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理类是获取的深入理解

从上一文中大致的分析了JDK动态代理的流程,发现很多细节的部分没能一一俱到,借此再深入写一遍作为记录,同时参考了大量的文章,汇总到一起,得到以下的精华部分


上一篇我们分析了Proxy类的内部是怎样产生代理类的,我们看到了Proxy内部用到了 缓存机制,如果根据提供的类加载器和接口数组能 在缓存中找到代理类就直接返回该代理类,否则会调用ProxyClassFactory工厂去生成代理类。这里用到的缓存是二级缓存,它的一级缓存key是根据类加载器生成的,二级缓存key是根据接口数组生成的。具体的内部机制我们直接贴上代码详细解释

WeakCache的成员变量和构造器

直接上源码分析

/* 公纵号  孤独的投机家  有大量精华分析 */

//Reference引用队列
private final ReferenceQueue<K> refQueue = new ReferenceQueue<>();
//缓存的底层实现, key为一级缓存, value为二级缓存。 为了支持null, map的key类型设置为Object
private final ConcurrentMap<Object, ConcurrentMap<Object, Supplier<V>>>
                                                       map = new ConcurrentHashMap<>();
//reverseMap记录了所有代理类生成器是否可用, 这是为了实现缓存的过期机制
private final ConcurrentMap<Supplier<V>, Boolean> reverseMap = new ConcurrentHashMap<>();
//生成二级缓存key的工厂, 这里传入的是KeyFactory
private final BiFunction<K, P, ?> subKeyFactory;
//生成二级缓存value的工厂, 这里传入的是ProxyClassFactory
private final BiFunction<K, P, V> valueFactory;

//构造器, 传入生成二级缓存key的工厂和生成二级缓存value的工厂
public WeakCache(BiFunction<K, P, ?> subKeyFactory, BiFunction<K, P, V> valueFactory) {
   
    this.subKeyFactory = Objects.requireNonNull(subKeyFactory);
    this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值