动态代理模式newProxyInstance及invoke方法参数详解
動態代理概述:
Java提供的動態代理類Proxy:
Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods. 代理類Proxy提供靜態方法用于創建動態代理子類和對象。它也是所有通過這些靜態方法所創建的動態代理子類的父類。其中一個最常用的靜態方法就是:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler. 返回一個實現了所有指定接口的代理子類對象,該對象將方法調用分派給指定的調用處理器。
ClassLoader :被代理類的類加載器,方法內部會調用這個類加載器來獲取繼承Proxy類的子類字節碼文件對象Class,加載的同時該子類也實現所有指定的接口。
Class<?>[] interfaces: 被代理類 的所有實現接口的Class對象,在方法內部會克隆一份加載進Proxy字節碼對象中。
表示實現Proxy類實現所有指定接口。
InvocationHandler接口:(調用處理器)
InvocationHandler is the interface implemented by the invocation handler of a proxy instance. 調用處理器是一個通過 代理對象的調用處理器(Handler實現類中的invoke) 來實現的接口 Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler. 每一個代理對象都有相關聯的調用處理器。 當一個方法伴隨所屬代理對象被調用,這個方法調用就會被編碼轉移為調用處理器中的相應擴展方法調用。? 總的來講,每一個proxy代理對象都有一個實現InvocationHandler接口的實現類Handler,這個實現類中的invoke方法就是proxy代理對象的實際調用處理器,在這個invoke方法體中,有所有 被代理對象 的方法邏輯實現和擴展。
? 每當代理對象proxy被反射機制用于調用其方法時,這個方法調用就自動轉移為Handler類里invoke方法體中的對應擴展方法調用。
InvocationHandler這個接口的唯一一個方法 invoke 方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable proxy:代理對象,只是反射機制調用方法的需要 method: proxy被反射機制用于調用的方法對象 args:調用方法的參數列表動態代理實現:
這里面首先想要做到動態代理,必須先實現這個InvocationHandler接口,然后我們主要看getProxy方法,參數是需要被代理的對象Singer
? 方法里面有一個Proxy類,這個Proxy類提供了很多方法,這里我們用的是newProxyInstance方法,它有三個參數,第一個是被代理類的類構造器,第二個指的是被代理類的接口,也就是Singer的接口,第三個是實現這個代理過程的類,就是本類。具體的來說,這個方法執行了下面三步:
? 1.用ClassLoader加載器生成一個實現了參數interfaces里所有接口且繼承了Proxy的代理類的字節碼對象。
? 2.使用Proxy的構造函數 Proxy(InvocationHandler h)來創造一個代理類的實例,將我們自定義的InvocationHandler子類傳入。
? 3.返回這個代理類實例對象,因為我們構造的代理類實現了interfaces(也就是我們程序中傳入的Singer.class.getInterfaces())里的所有接口,因此返回的代理類可以強轉成Star類型來調用接口中定義的方法。
而在調用每個代理類每個方法的時候,都用反射去調InvocationHandler實現類的invoke方法(也就是我們自定義的AutoProxy重寫的invoke方法),用參數傳遞了代理類實例、接口方法、調用參數列表,這樣我們在重寫的invoke方法中就可以實現對所有方法的統一包裝了。
總結
以上是生活随笔為你收集整理的动态代理模式newProxyInstance及invoke方法参数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html全屏背景视频特效,HTML5全屏
- 下一篇: 寒假回家只带一本书:《编程之美》——华中