1. 程式人生 > 其它 >回顧動態代理 java.lang.reflect Class Proxy

回顧動態代理 java.lang.reflect Class Proxy

首先:

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就是執行方法的結果;