1. 程式人生 > >動態代理詳解

動態代理詳解

font output 接口 col tle 訪問 AC 學習 stat

動態代理詳解

? ?動態代理它可以直接給某一個目標對象生成一個代理對象,而不需要代理類存在。
? ? 動態代理與代理模式原理是一樣的,只是它沒有具體的代理類,直接通過反射生成了一個代理對象。
? ? 動態代理生成技術:
? ? ? ? 1. 基於jdk提供一個Proxy類,可以直接給實現某接口的實現類直接生成代理對象。
? ? ? ? 2. 基於cglib (spring框架會學習)

? ? java.lang.reflect.Proxy; ? 該類可以直接生成一個代理對象。

? ? Proxy類的方法
? ? ? ? public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回一個指定接口的代理類實例。
? ? ? ? ? ? 僅能代理實現至少一個接口的類(即目標對象需要至少有一個接口)。
? ? ? ? ? ? ClassLoader:類加載器。固定寫法,和被代理類使用相同的類加載器即可。
? ? ? ? ? ? Class[]:代理類要實現的接口。固定寫法,和被代理類使用相同的接口即可。
? ? ? ? ? ? InvocationHandler:策略(方案)設計模式

的應用。如何去具體實現代理,由我們自己決定。

? ? InvocationHandler接口中的invoke方法:調用代理類的任何方法,此方法都會執行。
? ? ? ? Object invoke(Object proxy, Method method, Object[] args)
? ? ? ? ? ? Object proxy:代理對象本身的引用。一般用不著。
? ? ? ? ? ? Method method:當前調用的方法。
? ? ? ? ? ? Object[] args:當前方法用到的參數。

? ? 動態代理的應用
? ? ? ? 在動態代理技術裏,由於不管用戶調用代理對象的什麽方法,都是調用開發人員編寫的處理器的invoke方法(這相當於invoke方法攔截到了被代理對象的方法調用

)。
? ? ? ? 並且,開發人員通過invoke方法的參數,還可以在攔截的同時,知道用戶調用的是什麽方法,因此利用這兩個特性,就可以實現一些特殊需求,

        例如:攔截用戶的訪問請求,以檢查用戶是否有訪問權限動態地為目的對象添加額外的功能

? ? 靜態/動態代理圖解:

技術分享圖片

動態代理詳解