1,靜態(tài)代理
1)靜態(tài)代理
2,動態(tài)代理
1)newProxyInstance生成代理類的實例
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader(類加載器
):the class loader to define the proxy class
interfaces(代理類要實現(xiàn)的接口
):the list of interfaces for the proxy class to implement
h(InvocationHandler
):the invocation handler to dispatch method invocations to每一個proxy實例柬讨,都關(guān)聯(lián)一個InvocationHandler。
2)當(dāng)proxy調(diào)用一個方法,會dispatch到invocationHandler卷仑,handler會擁有一個proxied(target目標(biāo)對象
)實例,底層使用反射調(diào)用proxied(target
)的方法麸折。
public Object invoke(Object proxy, Method method, Object[] args)
3)創(chuàng)建Proxy對象锡凝。
java.lang.reflect.Proxy類,provides static methods for creating dynamic proxy classes and instances
Class<?> cl = getProxyClass0(loader, intfs);
subKeyFactory.apply(key, parameter)
生成的Class代理類垢啼,com.sun.proxy.$Proxy0
String proxyName = proxyPkg + proxyClassNamePrefix + num;
4)動態(tài)代理實例
m1 = Method 反射獲取doSomething方法
此處的doSomething()方法窜锯,就已經(jīng)不是原始的MyInterface里的doSomething()方法了,而是新生成的代理類的doSomething()方法芭析。
proxy.doSomething()底層锚扎,proxy.invocationHandler.invoke(this, m1, null),就是調(diào)用m1.invoke(realObject, null)
public static void consumer(MyInterface proxy){
proxy.doSomething();
}
3馁启,代理類細(xì)節(jié)
1)Proxy代理類生成的對象驾孔。
JDK的動態(tài)代理芍秆,生成的新代理類就是繼承了Proxy基類,實現(xiàn)了傳入的接口的類翠勉。
extends Proxy implements Myinterface妖啥。
2)Proxy類有一個成員變量InvocationHandler
生成代理類時,會初始化一個InvocationHandler
3)返回對象理解
InvocationHandler的invoke方法对碌,返回的Object是真實對象方法的返回結(jié)果:Object invoke(Object proxy, Method method, Object[] args) throws Throwable
Proxy的newProxyInstance方法荆虱,返回Object是代理類的實例:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException