Java JDK 动态代理源码小结

Java JDK 动态代理源码小结

Proxy

原理

  • 使用 WeakCache 管理和(ProxyClassFactory)生成代理类

内部接口和类

  • private static final class KeyFactory implements BiFunction<ClassLoader, Class<?>[], Object>
    • 生成 key 的工厂,ClassLoader + 接口数组的 hash code
    • 除 key0 外,其它的生成的 key 都用了弱引用
  • private static final class ProxyClassFactory implements BiFunction<ClassLoader, Class<?>[], Class<?>>
    • 生成代理类的工厂,ClassLoader + 接口数组的 hash code
    • 生成方式:反射字节 + native
    • 代理类名:AtomicLong nextUniqueNumber
  • private static final class Key1 extends WeakReference<Class<?>>
    • 只有 1 个接口时 KeyFactory 生成的 key
    • 继承弱引用
  • private static final class Key2 extends WeakReference<Class<?>>
    • 只有 2 个接口时 KeyFactory 生成的 key
    • 继承弱引用
  • private static final class KeyX
    • 大于 2 个接口时 KeyFactory 生成的 key
    • 内部使用弱引用

私有属性

  • private static final WeakCache<ClassLoader, Class<?>[], Class<?>> proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());
    • 此类内部用弱引用管理和(ProxyClassFactory)生成代理类
  • private static final Object key0 = new Object()
    • 没有接口时 KeyFactory 生成的 key

WeakCache<K, P, V>

原理

  • 泛型的 K = ClassLoader,P = 接口数组,V = 生成的代理类
  • 用弱引用管理,每次调用 non-static 方法都会先检查引用是否有效,无效则清理 map 和 reverseMap

内部接口和类

  • private final class Factory implements Supplier
    • 工厂,get 后生成代理类和 CacheValue
    • 实际还是调用外部类的 valueFactory(就是 Proxy 类中的 ProxyClassFactory)生成代理类
  • private interface Value extends Supplier
  • private static final class CacheKey extends WeakReference
    • 弱引用包装 ClassLoader
    • hash 字段是 ClassLoader hash
    • 传入的队列其实就是外部类私有属性 refQueue
  • private static final class CacheValue extends WeakReference implements Value
    • 弱引用包装生成的代理类
    • hash 字段是生成的代理类 hash
  • private static final class LookupValue implements Value
    • 包装生成的代理类
    • 只用于 WeakCache.containsValue 方法
    • 没有 hash 字段,hash 是生成的代理类 hash

私有属性

  • private final ReferenceQueue refQueue
    • 泛型的 K = ClassLoader
    • 给 CacheKey 用
  • private final ConcurrentMap<Object, ConcurrentMap<Object, Supplier>> map
    • CacheKey(弱引用包装的 ClassLoader) -> (subkeyFactory 生成的)(弱引用)(0 个接口不是弱引用)ClassLoader + 接口数组 hash code -> Factory (包装 ValueFactory)(当 subKey 对应的 value 不存在时 value 才是 Factory) 或 CacheValue(当 subKey 对应的 value 是 Factory,就会执行 Factory .get() 方法生成 CacheValue,然后替换 Factory 为 CacheValue)(即第一次是 Factory,第二次才是 CacheValue)
  • private final ConcurrentMap<Supplier, Boolean> reverseMap
    • key = CacheValue(hash is value hash)
    • 用途:Proxy.isProxyClass,Map 是 O(1)
  • private final BiFunction<K, P, ?> subkeyFactory
    • 就是 Proxy 类中的 KeyFactory
    • 内有 weak(如果只有 0 个接口没有)
  • private final BiFunction<K, P, V> valueFactory
    • 就是 Proxy 类中的 ProxyClassFactory
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值