動態代理詳解
動態代理詳解
? ?動態代理
它可以直接給某一個目標對象
生成一個代理對象
,而不需要代理類存在。
? ? 動態代理與代理模式原理是一樣的,只是它沒有具體的代理類
,直接通過反射
生成了一個代理對象。
? ? 動態代理生成技術:
? ? ? ? 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方法的參數,還可以在攔截的同時,知道用戶調用的是什麽方法,因此利用這兩個特性,就可以實現一些特殊需求,
例如:攔截用戶的訪問請求,以檢查用戶是否有訪問權限、動態地為目的對象添加額外的功能。
? ? 靜態/動態代理圖解:
動態代理詳解