回顧動態代理 java.lang.reflect Class Proxy
阿新 • • 發佈:2022-05-31
首先:
Class Proxy:
Module java.base
Package java.lang.reflect
Class Proxy
public class Proxy
extends Object
implements Serializable
如何實現動態代理?
檢視Proxy中的方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
檢視引數:
loader——定義代理類的類載入器 interfaces——代理類要實現的介面列表 h -將方法呼叫分派給的呼叫處理程式
總結:使用代理類需要:
被代理類的類載入器 ClassLoader 物件;
被代理類實現的介面的class;(建立的代理類也會實現這個介面)
還要一個執行操作的類 -- 實現了 InvocationHandler 介面的子類。
這樣返回的就是第二個傳入的介面型別的物件,使用這個物件就能執行被代理類中的方法。
如何執行方法?
InvocationHandler 介面:
Module java.base
Package java.lang.reflect
Interface InvocationHandler
public interface InvocationHandler
該介面只有一個方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
引數:
proxy 呼叫方法的代理例項
method 對應於代理例項上呼叫的介面方法的Method例項。
args 包含在代理例項上的方法呼叫中傳遞的引數值的物件陣列,如果介面方法不接受任何引數,則返回 null。
實現並重寫這個方法,一般需要建立一個接收代理類的屬性:
然後使用這個屬性呼叫傳入的方法method引數:
Object result = method.invoke(target,args)
然後返回result就是執行方法的結果;