簡介 java.lang.reflect.Proxy是整個jdk中實現動態代理的核心 類,本文主要介紹Proxy類的實現,關於Proxy類的使用請自行查閱其他資料。 Field constructorParams:構造函數的參數,用於代理類的核心的邏輯實現,關於InvocationHandler這個 ...
簡介
java.lang.reflect.Proxy是整個jdk中實現動態代理的核心 類,本文主要介紹Proxy類的實現,關於Proxy類的使用請自行查閱其他資料。
-
constructorParams:構造函數的參數,用於代理類的核心的邏輯實現,關於InvocationHandler這個介面的介紹不是本文的重點,此處不做介紹。
private static final Class<?>[] constructorParams =
{ InvocationHandler.class };
-
proxyClassCache: 代理類的緩存,此類是一個二級緩存的實現,利用WeakReference的特性,當記憶體占用過高的時候會JVM自動進行回收緩存中的數據。
private static final WeakCache<ClassLoader, Class<?>[], Class<?>>
proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());
-
h: InvocationHandler介面,用於此代理實例的調用處理程式。
Inner Class
-
KeyFactory:顧名思義,緩存代理的key的工廠實現,此類僅一個方法,實現了BiFunction介面,具體代碼如下
private static final class KeyFactory
implements BiFunction<ClassLoader, Class<?>[], Object>
{
由以上代碼可見,該類的實現分為委托給了Key0,Key1,Key2,KeyX這四個類實現,其中key0是一個Object,其他的類Key1,Key2,KeyX則是分別用不同的實現對hashcode和equals方法進行了不同的實現,大同小異。這裡則分別簡單的做一下解釋。
private static final class Key1 extends WeakReference<Class<?>> {
private final int hash;
Key1(Class<?> intf) {
super(intf);
this.hash = intf.hashCode();
}
private static final class Key2 extends WeakReference<Class<?>> {
private final int hash;
private final WeakReference<Class<?>> ref2;
Key2(Class<?> intf1, Class<?> intf2) {
super(intf1);
hash = 31 * intf1.hashCode() + intf2.hashCode();
ref2 = new WeakReference<Class<?>>(intf2);
}
private static final class KeyX {
private final int hash;
private final WeakReference<Class<?>>[] refs;
-
ProxyClassFactory: 顧名思義, 代理類的生產工廠類,用於生成代理類,此類也是實現了BiFunction,技能一個apply方法,最終根據ClassLoader,Interface,proxyName參數調用java.lang.reflect.Proxy#defineClass0這個本地方法生成代理類。
private static final class ProxyClassFactory
implements BiFunction<ClassLoader, Class<?>[], Class<?>>
{
// 代理類名稱的首碼,我們看到的代理類的名稱都有這個首碼就是這個原因
private static final String proxyClassNamePrefix = "$Proxy";
// 用於生成代理類名稱的唯一的序號
private static final AtomicLong nextUniqueNumber = new AtomicLong();