2019-06-23 Java核心代碼看書筆記(六) 代理

一,什么是代理

利用代理可以在運行時創(chuàng)建一個實現(xiàn)了一組給定接口的新類,這種只有編譯時無法確定需要實現(xiàn)那個接口時才有必要使用

二,何時使用代理

有一個表示接口Class對象,它的準確類型編譯時候無法知道,想要構造一個實現(xiàn)這些接口的類,想要構建一個實現(xiàn)這些接口的類,需要使用NewInstance或反射出這個類的構造器,但是,不能實例化一個接口,需要在程序處于運行時定義一個新類

代理類可以解決這個問題:運行的時候創(chuàng)建全新的類,能實現(xiàn)指定的接口,具有下列的方法

①指定接口鎖需要的全部方法
②Object類中的全部方法

注:不能在運行的時候定義這些方法的代碼,需要提供一個調(diào)用處理器,調(diào)用處理器實現(xiàn)了IncocationHandler接口的類對象,這個接口只有一個方法
Object Invoke(objetct proxy,Method method,Object[] args),無論何時調(diào)用代理器對象的方法,都會調(diào)用invoke方法,并向其傳遞method對象和原始的調(diào)用參數(shù)

三,創(chuàng)建代理對象和運用場景

創(chuàng)建一個代理對象,需要使用proxy類的newProxyInstance方法
①ClassLoader loader:指定當前目標對象使用類加載器,獲取加載器的方法是固定的
②Class<?>[] interfaces:目標對象實現(xiàn)的接口類型,使用泛型方式確認類型,獲取接口類型的方法是固定的
③InvocationHandler h;事件處理,執(zhí)行目標對象的方法時,會觸發(fā)事件處理器的方法,會把當前執(zhí)行目標對象的方法作為參數(shù)傳入

例子

public interface Hello {
    void doSomething();
}
 
public class HelloImpl implements Hello {
    @Override
    public void doSomething() {
        System.out.println("HelloImpl doSomething");
    }
}
 
/**
 * 代理類
 */
public class ProxyHandler implements InvocationHandler {
    private Object proxyed;
 
    public ProxyHandler(Object proxy) {
        proxyed = proxy;
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
        System.out.println("proxy working");
        return method.invoke(proxyed, args);
    }
}
 
public static void main(String[] args) {
    Hello hello = new HelloImpl();
    Hello proxy = (Hello) Proxy.newProxyInstance(Hello.class.getClassLoader(),
            new Class[]{Hello.class}, new ProxyHandler(hello));
 
    proxy.doSomething();
}

輸出結(jié)果

proxy working
HelloImpl doSomething

運用1.
路由對遠程方法的調(diào)用
運用2.
在程序運行區(qū)間,將用戶接口事件與動作關聯(lián)起來
運用3.
為調(diào)試,跟蹤方法調(diào)用
運用4. spring aop

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,666評論 1 32
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,430評論 6 13
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,184評論 0 3
  • 電腦上,正在播放汪峰的《美麗世界的孤兒》:“別哭,親愛的人,我們要堅強,我們要微笑,因為無論我們怎樣, 我們永遠是...
    小考拉俱樂部閱讀 836評論 8 3
  • 我們是高大上的臨時工,我們24時貼心為你服務,只要你有需要,請聯(lián)系我們,我們可以代替你工作,無論是一家公司的經(jīng)理,...
    了拉蘇木閱讀 392評論 0 0

友情鏈接更多精彩內(nèi)容