一般地,实现 JDK 静态代理需要三个类:服务接口、代理类、被代理类。代理类和被代理类都需要实现服务接口。
比如,Tomcat 中 Request 和 RequestFacade 应该也属于代理类与被代理类的关系。它们均实现了 HttpServletRequest 接口,并且 RequestFacade 是 Request 的一个属性。可以认为 Request 的方法会被委托给 RequestFacade 完成。
JDK 动态代理动态代理最终会生成一个代理类,但是真正执行方法的是 InvactionHandler
java.lang.reflect.Proxy#newProxyInstance
其中,调用方法 getProxyClass0 寻找或者生成 Proxy Class。
Proxy 拥有一个属性 proxyClassCache,寻找或生成 Proxy Class 会从该属性中得到:
private static final WeakCacheWeakCache[], Class>> proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());
WeakCache 是一个有三个泛型的类 WeakCache 表示参数类型, WeakCache 是一个
(
k
e
y
,
s
u
b
−
k
e
y
)
−
>
v
a
l
u
e
(key, sub-key) -> value
(key,sub−key)−>value 的映射缓存。底层结构: key 和 value 是弱引用,sub-key 是强引用。因为 key 的实现类是 CacheKey,value 的实现类是 Cachevalue,它们都实现了 WeakReference。 key 和 parameter 传递给 get() 方法。sub-key 通过使用 subKeyFactory 从 key 和 parameter 中计算出来。value 通过 valueFactory 从 key 和 parameter 中计算。 当调用 get(), containsValue(), size() 方法的时候,entry 会从缓存中删除(惰性)。 V get(K key, P parameter) 方法逻辑: Proxy 提供的内部类 KeyFactory,根据 interfaces 的数量,返回不同的 Key 实例: 该工厂类用于生成 WeakCache 的 sub-key。 Proxy 提供的内部类 ProxyClassFactory。底层调用 native 方法 defineClass0 获得 Class。 该工厂类用于生成 WeakCache 的 value。private final ConcurrentMap
key 可以为空,但是 sub-key 和 value 不可以为空。private final ReferenceQueue
KeyFactory



