本文主要是介绍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
这篇关于Java JDK 动态代理源码小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!